OK, this is really the last one tonight!

NEWFALSE and NEWTRUE.
diff --git a/Lib/pickle.py b/Lib/pickle.py
index aa67ed1..95bdd26 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -356,7 +356,10 @@
     dispatch[NoneType] = save_none
 
     def save_bool(self, object):
-        self.write(object and TRUE or FALSE)
+        if self.proto >= 2:
+            self.write(object and NEWTRUE or NEWFALSE)
+        else:
+            self.write(object and TRUE or FALSE)
     dispatch[bool] = save_bool
 
     def save_int(self, object, pack=struct.pack):
@@ -760,6 +763,14 @@
         self.append(None)
     dispatch[NONE] = load_none
 
+    def load_false(self):
+        self.append(False)
+    dispatch[NEWFALSE] = load_false
+
+    def load_true(self):
+        self.append(True)
+    dispatch[NEWTRUE] = load_true
+
     def load_int(self):
         data = self.readline()
         if data == FALSE[1:]:
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 50e9aa4..3d65383 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -293,6 +293,13 @@
                 y = self.loads(s)
                 self.assertEqual(x, y, (proto, x, s, y))
 
+    def test_singletons(self):
+        for proto in 0, 1, 2:
+            for x in None, False, True:
+                s = self.dumps(x, proto)
+                y = self.loads(s)
+                self.assert_(x is y, (proto, x, s, y))
+
 class AbstractPickleModuleTests(unittest.TestCase):
 
     def test_dump_closed_file(self):