Implement an idea by Paul Rubin:

Change pickling format for bools to use a backwards compatible
encoding.  This means you can pickle True or False on Python 2.3
and Python 2.2 or before will read it back as 1 or 0.  The code
used for pickling bools before would create pickles that could
not be read in previous Python versions.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index 9871627..a99d69f 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -77,8 +77,8 @@
 #define TUPLE       't'
 #define EMPTY_TUPLE ')'
 #define SETITEMS    'u'
-#define TRUE        'Z'
-#define FALSE       'z'
+#define TRUE        "I01\n"
+#define FALSE       "I00\n"
 
 
 static char MARKv = MARK;
@@ -936,10 +936,11 @@
 static int
 save_bool(Picklerobject *self, PyObject *args) 
 {
-	static char buf[2] = {FALSE, TRUE};
+	static char *buf[2] = {FALSE, TRUE};
+	static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
 	long l = PyInt_AS_LONG((PyIntObject *)args);
 
-	if ((*self->write_func)(self, buf + l, 1) < 0)
+	if ((*self->write_func)(self, buf[l], len[l]) < 0)
 		return -1;
 
 	return 0;
@@ -2655,7 +2656,12 @@
 		}
 	}
 	else {
-		if (!( py_int = PyInt_FromLong(l)))  goto finally;
+		if (len == 3 && (l == 0 || l == 1)) {
+			if (!( py_int = PyBool_FromLong(l)))  goto finally;
+		}
+		else {
+			if (!( py_int = PyInt_FromLong(l)))  goto finally;
+		}
 	}
 
 	free(s);
@@ -3763,16 +3769,6 @@
 				break;
 			continue;
 
-		case FALSE:
-			if (load_false(self) < 0)
-				break;
-			continue;
-
-		case TRUE:
-			if (load_true(self) < 0)
-				break;
-			continue;
-
 		case BININT:
 			if (load_binint(self) < 0)
 				break;