diff --git a/Lib/CGIHTTPServer.py b/Lib/CGIHTTPServer.py
index c3a6a18..56dee47 100644
--- a/Lib/CGIHTTPServer.py
+++ b/Lib/CGIHTTPServer.py
@@ -307,7 +307,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return st[0] & 0111 != 0
 
 
diff --git a/Lib/StringIO.py b/Lib/StringIO.py
index 087092e..cc88e9d 100644
--- a/Lib/StringIO.py
+++ b/Lib/StringIO.py
@@ -59,7 +59,7 @@
     def isatty(self):
         if self.closed:
             raise ValueError, "I/O operation on closed file"
-        return 0
+        return False
 
     def seek(self, pos, mode = 0):
         if self.closed:
diff --git a/Lib/chunk.py b/Lib/chunk.py
index 1dc4a77..bda965f 100644
--- a/Lib/chunk.py
+++ b/Lib/chunk.py
@@ -25,13 +25,13 @@
 exception.
 
 Usage:
-while 1:
+while True:
     try:
         chunk = Chunk(file)
     except EOFError:
         break
     chunktype = chunk.getname()
-    while 1:
+    while True:
         data = chunk.read(nbytes)
         if not data:
             pass
@@ -49,9 +49,9 @@
 """
 
 class Chunk:
-    def __init__(self, file, align = 1, bigendian = 1, inclheader = 0):
+    def __init__(self, file, align=True, bigendian=True, inclheader=False):
         import struct
-        self.closed = 0
+        self.closed = False
         self.align = align      # whether to align to word (2-byte) boundaries
         if bigendian:
             strflag = '>'
@@ -71,9 +71,9 @@
         try:
             self.offset = self.file.tell()
         except (AttributeError, IOError):
-            self.seekable = 0
+            self.seekable = False
         else:
-            self.seekable = 1
+            self.seekable = True
 
     def getname(self):
         """Return the name (ID) of the current chunk."""
@@ -86,14 +86,14 @@
     def close(self):
         if not self.closed:
             self.skip()
-            self.closed = 1
+            self.closed = True
 
     def isatty(self):
         if self.closed:
             raise ValueError, "I/O operation on closed file"
-        return 0
+        return False
 
-    def seek(self, pos, whence = 0):
+    def seek(self, pos, whence=0):
         """Seek to specified position into the chunk.
         Default position is 0 (start of chunk).
         If the file is not seekable, this will result in an error.
@@ -117,7 +117,7 @@
             raise ValueError, "I/O operation on closed file"
         return self.size_read
 
-    def read(self, size = -1):
+    def read(self, size=-1):
         """Read at most size bytes from the chunk.
         If size is omitted or negative, read until the end
         of the chunk.
diff --git a/Lib/dospath.py b/Lib/dospath.py
index cfc0d86..b4aab49 100644
--- a/Lib/dospath.py
+++ b/Lib/dospath.py
@@ -141,7 +141,7 @@
     """Is a path a symbolic link?
     This will always return false on systems where posix.lstat doesn't exist."""
 
-    return 0
+    return False
 
 
 def exists(path):
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 870322c..77487ed 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -154,7 +154,7 @@
         self._lineno = 0
         self._filelineno = 0
         self._file = None
-        self._isstdin = 0
+        self._isstdin = False
         self._backupfilename = None
         self._buffer = []
         self._bufindex = 0
@@ -214,7 +214,7 @@
             try: os.unlink(backupfilename)
             except: pass
 
-        self._isstdin = 0
+        self._isstdin = False
         self._buffer = []
         self._bufindex = 0
 
@@ -235,12 +235,12 @@
             self._files = self._files[1:]
             self._filelineno = 0
             self._file = None
-            self._isstdin = 0
+            self._isstdin = False
             self._backupfilename = 0
             if self._filename == '-':
                 self._filename = '<stdin>'
                 self._file = sys.stdin
-                self._isstdin = 1
+                self._isstdin = True
             else:
                 if self._inplace:
                     self._backupfilename = (
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 9e9f5d4..793a3b5 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -47,7 +47,7 @@
         if mode[0:1] == 'r':
             self.mode = READ
             # Set flag indicating start of a new member
-            self._new_member = 1
+            self._new_member = True
             self.extrabuf = ""
             self.extrasize = 0
             self.filename = filename
@@ -120,12 +120,12 @@
             self.fileobj.read(xlen)
         if flag & FNAME:
             # Read and discard a null-terminated string containing the filename
-            while (1):
+            while True:
                 s=self.fileobj.read(1)
                 if not s or s=='\000': break
         if flag & FCOMMENT:
             # Read and discard a null-terminated string containing a comment
-            while (1):
+            while True:
                 s=self.fileobj.read(1)
                 if not s or s=='\000': break
         if flag & FHCRC:
@@ -156,7 +156,7 @@
         readsize = 1024
         if size < 0:        # get the whole thing
             try:
-                while 1:
+                while True:
                     self._read(readsize)
                     readsize = readsize * 2
             except EOFError:
@@ -201,7 +201,7 @@
             self._init_read()
             self._read_gzip_header()
             self.decompress = zlib.decompressobj(-zlib.MAX_WBITS)
-            self._new_member = 0
+            self._new_member = False
 
         # Read a chunk of data from the file
         buf = self.fileobj.read(size)
@@ -229,7 +229,7 @@
             # Check the CRC and file size, and set the flag so we read
             # a new member on the next call
             self._read_eof()
-            self._new_member = 1
+            self._new_member = True
 
     def _add_read_data(self, data):
         self.crc = zlib.crc32(data, self.crc)
@@ -275,7 +275,7 @@
         self.fileobj.flush()
 
     def isatty(self):
-        return 0
+        return False
 
     def tell(self):
         return self.offset
@@ -286,7 +286,7 @@
         if self.mode != READ:
             raise IOError("Can't rewind in write mode")
         self.fileobj.seek(0)
-        self._new_member = 1
+        self._new_member = True
         self.extrabuf = ""
         self.extrasize = 0
         self.offset = 0
@@ -311,7 +311,7 @@
         if size < 0: size = sys.maxint
         bufs = []
         readsize = min(100, size)    # Read from the file in small chunks
-        while 1:
+        while True:
             if size == 0:
                 return "".join(bufs) # Return resulting line
 
@@ -342,7 +342,7 @@
         while sizehint > 0:
             line = self.readline()
             if line == "": break
-            L.append( line )
+            L.append(line)
             sizehint = sizehint - len(line)
 
         return L
@@ -390,7 +390,7 @@
             else:
                 f = __builtin__.open(arg, "rb")
                 g = open(arg + ".gz", "wb")
-        while 1:
+        while True:
             chunk = f.read(1024)
             if not chunk:
                 break
diff --git a/Lib/macpath.py b/Lib/macpath.py
index 80deaa9..91412c5 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -125,7 +125,7 @@
     """Return true if the pathname refers to a symbolic link.
     Always false on the Mac, until we understand Aliases.)"""
 
-    return 0
+    return False
 
 
 def isfile(s):
@@ -134,7 +134,7 @@
     try:
         st = os.stat(s)
     except os.error:
-        return 0
+        return False
     return S_ISREG(st[ST_MODE])
 
 
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 8cd8e9a..370bd6e 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -235,7 +235,7 @@
 
 def islink(path):
     """Test for symbolic link.  On WindowsNT/95 always returns false"""
-    return 0
+    return False
 
 
 # Does a path exist?
@@ -259,7 +259,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISDIR(st[stat.ST_MODE])
 
 
@@ -272,7 +272,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISREG(st[stat.ST_MODE])
 
 
diff --git a/Lib/os2emxpath.py b/Lib/os2emxpath.py
index 01db974..451fb0e 100644
--- a/Lib/os2emxpath.py
+++ b/Lib/os2emxpath.py
@@ -194,7 +194,7 @@
 
 def islink(path):
     """Test for symbolic link.  On OS/2 always returns false"""
-    return 0
+    return False
 
 
 # Does a path exist?
@@ -216,7 +216,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISDIR(st[stat.ST_MODE])
 
 
@@ -229,7 +229,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISREG(st[stat.ST_MODE])
 
 
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index cceb2d2..0b984f6 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -158,7 +158,7 @@
     try:
         st = os.lstat(path)
     except (os.error, AttributeError):
-        return 0
+        return False
     return stat.S_ISLNK(st[stat.ST_MODE])
 
 
@@ -183,7 +183,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISDIR(st[stat.ST_MODE])
 
 
@@ -196,7 +196,7 @@
     try:
         st = os.stat(path)
     except os.error:
-        return 0
+        return False
     return stat.S_ISREG(st[stat.ST_MODE])
 
 
@@ -335,7 +335,7 @@
         import re
         _varprog = re.compile(r'\$(\w+|\{[^}]*\})')
     i = 0
-    while 1:
+    while True:
         m = _varprog.search(path, i)
         if not m:
             break
diff --git a/Lib/pprint.py b/Lib/pprint.py
index 82eeac6..1c11593 100644
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -126,8 +126,8 @@
         objid = _id(object)
         if objid in context:
             stream.write(_recursion(object))
-            self.__recursive = 1
-            self.__readable = 0
+            self.__recursive = True
+            self.__readable = False
             return
         rep = self.__repr(object, context, level - 1)
         typ = _type(object)
@@ -195,9 +195,9 @@
         repr, readable, recursive = self.format(object, context.copy(),
                                                 self.__depth, level)
         if not readable:
-            self.__readable = 0
+            self.__readable = False
         if recursive:
-            self.__recursive = 1
+            self.__recursive = True
         return repr
 
     def format(self, object, context, maxlevels, level):
@@ -214,7 +214,7 @@
     typ = _type(object)
     if typ is StringType:
         if 'locale' not in _sys_modules:
-            return `object`, 1, 0
+            return `object`, True, False
         if "'" in object and '"' not in object:
             closure = '"'
             quotes = {'"': '\\"'}
@@ -229,19 +229,19 @@
                 write(char)
             else:
                 write(qget(char, `char`[1:-1]))
-        return ("%s%s%s" % (closure, sio.getvalue(), closure)), 1, 0
+        return ("%s%s%s" % (closure, sio.getvalue(), closure)), True, False
 
     if typ is DictType:
         if not object:
-            return "{}", 1, 0
+            return "{}", True, False
         objid = _id(object)
         if maxlevels and level > maxlevels:
-            return "{...}", 0, objid in context
+            return "{...}", False, objid in context
         if objid in context:
-            return _recursion(object), 0, 1
+            return _recursion(object), False, True
         context[objid] = 1
-        readable = 1
-        recursive = 0
+        readable = True
+        recursive = False
         components = []
         append = components.append
         level += 1
@@ -252,29 +252,29 @@
             append("%s: %s" % (krepr, vrepr))
             readable = readable and kreadable and vreadable
             if krecur or vrecur:
-                recursive = 1
+                recursive = True
         del context[objid]
         return "{%s}" % _commajoin(components), readable, recursive
 
     if typ is ListType or typ is TupleType:
         if typ is ListType:
             if not object:
-                return "[]", 1, 0
+                return "[]", True, False
             format = "[%s]"
         elif _len(object) == 1:
             format = "(%s,)"
         else:
             if not object:
-                return "()", 1, 0
+                return "()", True, False
             format = "(%s)"
         objid = _id(object)
         if maxlevels and level > maxlevels:
-            return format % "...", 0, objid in context
+            return format % "...", False, objid in context
         if objid in context:
-            return _recursion(object), 0, 1
+            return _recursion(object), False, True
         context[objid] = 1
-        readable = 1
-        recursive = 0
+        readable = True
+        recursive = False
         components = []
         append = components.append
         level += 1
@@ -282,14 +282,14 @@
             orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level)
             append(orepr)
             if not oreadable:
-                readable = 0
+                readable = False
             if orecur:
-                recursive = 1
+                recursive = True
         del context[objid]
         return format % _commajoin(components), readable, recursive
 
     rep = `object`
-    return rep, (rep and not rep.startswith('<')), 0
+    return rep, (rep and not rep.startswith('<')), False
 
 
 def _recursion(object):
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 587a24c..de6fc63 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -443,7 +443,7 @@
                                 r'RFC[- ]?(\d+)|'
                                 r'PEP[- ]?(\d+)|'
                                 r'(self\.)?(\w+))')
-        while 1:
+        while True:
             match = pattern.search(text, here)
             if not match: break
             start, end = match.span()
@@ -1521,7 +1521,7 @@
 
     def interact(self):
         self.output.write('\n')
-        while 1:
+        while True:
             self.output.write('help> ')
             self.output.flush()
             try:
@@ -1710,10 +1710,11 @@
         if not (os.path.islink(dir) and inode in self.inodes):
             self.inodes.append(inode) # detect circular symbolic links
             return ispackage(dir)
+        return False
 
     def run(self, callback, key=None, completer=None):
         if key: key = lower(key)
-        self.quit = 0
+        self.quit = False
         seen = {}
 
         for modname in sys.builtin_module_names:
@@ -1825,7 +1826,7 @@
 
         def serve_until_quit(self):
             import select
-            self.quit = 0
+            self.quit = False
             while not self.quit:
                 rd, wr, ex = select.select([self.socket.fileno()], [], [], 1)
                 if rd: self.handle_request()
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 96ab21c..65957ab 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -222,7 +222,7 @@
         data in RFC 2822-like formats that support embedded comments or
         free-text data.
         """
-        return None
+        return False
 
     def getallmatchingheaders(self, name):
         """Find all header lines matching a given header name.
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 0320885..1aba456 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -221,11 +221,11 @@
 def isname(name):
     # check that group name is a valid string
     if not isident(name[0]):
-        return 0
+        return False
     for char in name:
         if not isident(char) and not isdigit(char):
-            return 0
-    return 1
+            return False
+    return True
 
 def _group(escape, groups):
     # check if the escape string represents a valid group
diff --git a/Lib/statcache.py b/Lib/statcache.py
index 3123418..42e5e90 100644
--- a/Lib/statcache.py
+++ b/Lib/statcache.py
@@ -73,5 +73,5 @@
     try:
         st = stat(path)
     except _os.error:
-        return 0
+        return False
     return S_ISDIR(st[ST_MODE])
diff --git a/Lib/threading.py b/Lib/threading.py
index 706d5bb..491a7c0 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -30,7 +30,7 @@
 
 # Debug support (adapted from ihooks.py)
 
-_VERBOSE = 0
+_VERBOSE = 0 # XXX Bool or int?
 
 if __debug__:
 
@@ -198,7 +198,7 @@
                 # than 20 times per second (or the timeout time remaining).
                 endtime = _time() + timeout
                 delay = 0.0005 # 500 us -> initial delay of 1 ms
-                while 1:
+                while True:
                     gotit = waiter.acquire(0)
                     if gotit:
                         break
@@ -256,7 +256,7 @@
         self.__value = value
 
     def acquire(self, blocking=1):
-        rc = 0
+        rc = False
         self.__cond.acquire()
         while self.__value == 0:
             if not blocking:
@@ -270,7 +270,7 @@
             if __debug__:
                 self._note("%s.acquire: success, value=%s",
                            self, self.__value)
-            rc = 1
+            rc = True
         self.__cond.release()
         return rc
 
@@ -309,20 +309,20 @@
     def __init__(self, verbose=None):
         _Verbose.__init__(self, verbose)
         self.__cond = Condition(Lock())
-        self.__flag = 0
+        self.__flag = False
 
     def isSet(self):
         return self.__flag
 
     def set(self):
         self.__cond.acquire()
-        self.__flag = 1
+        self.__flag = True
         self.__cond.notifyAll()
         self.__cond.release()
 
     def clear(self):
         self.__cond.acquire()
-        self.__flag = 0
+        self.__flag = False
         self.__cond.release()
 
     def wait(self, timeout=None):
@@ -348,7 +348,7 @@
 
 class Thread(_Verbose):
 
-    __initialized = 0
+    __initialized = False
 
     def __init__(self, group=None, target=None, name=None,
                  args=(), kwargs={}, verbose=None):
@@ -359,10 +359,10 @@
         self.__args = args
         self.__kwargs = kwargs
         self.__daemonic = self._set_daemon()
-        self.__started = 0
-        self.__stopped = 0
+        self.__started = False
+        self.__stopped = False
         self.__block = Condition(Lock())
-        self.__initialized = 1
+        self.__initialized = True
 
     def _set_daemon(self):
         # Overridden in _MainThread and _DummyThread
@@ -388,7 +388,7 @@
         _limbo[self] = self
         _active_limbo_lock.release()
         _start_new_thread(self.__bootstrap, ())
-        self.__started = 1
+        self.__started = True
         _sleep(0.000001)    # 1 usec, to let the thread run (Solaris hack)
 
     def run(self):
@@ -397,7 +397,7 @@
 
     def __bootstrap(self):
         try:
-            self.__started = 1
+            self.__started = True
             _active_limbo_lock.acquire()
             _active[_get_ident()] = self
             del _limbo[self]
@@ -428,7 +428,7 @@
 
     def __stop(self):
         self.__block.acquire()
-        self.__stopped = 1
+        self.__stopped = True
         self.__block.notifyAll()
         self.__block.release()
 
@@ -523,7 +523,7 @@
 
     def __init__(self):
         Thread.__init__(self, name="MainThread")
-        self._Thread__started = 1
+        self._Thread__started = True
         _active_limbo_lock.acquire()
         _active[_get_ident()] = self
         _active_limbo_lock.release()
@@ -531,7 +531,7 @@
         atexit.register(self.__exitfunc)
 
     def _set_daemon(self):
-        return 0
+        return False
 
     def __exitfunc(self):
         self._Thread__stop()
@@ -564,16 +564,16 @@
 
     def __init__(self):
         Thread.__init__(self, name=_newname("Dummy-%d"))
-        self._Thread__started = 1
+        self._Thread__started = True
         _active_limbo_lock.acquire()
         _active[_get_ident()] = self
         _active_limbo_lock.release()
 
     def _set_daemon(self):
-        return 1
+        return True
 
     def join(self, timeout=None):
-        assert 0, "cannot join a dummy thread"
+        assert False, "cannot join a dummy thread"
 
 
 # Global API functions
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index 3c2c104..cfb4f64 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -546,13 +546,13 @@
         Both args must be URIs in reduced form.
         """
         if base == test:
-            return 1
+            return True
         if base[0] != test[0]:
-            return 0
+            return False
         common = posixpath.commonprefix((base[1], test[1]))
         if len(common) == len(base[1]):
-            return 1
-        return 0
+            return True
+        return False
 
 
 class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr):
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 0efcad3..4e7ea10 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -83,9 +83,10 @@
         endrec = fpin.read()
         fpin.close()
         if endrec[0:4] == "PK\005\006" and endrec[-2:] == "\000\000":
-            return 1    # file has correct magic number
+            return True                 # file has correct magic number
     except IOError:
         pass
+    return False
 
 
 class ZipInfo:
