Remove uses of the string and types modules:

x in string.whitespace => x.isspace()
type(x) in types.StringTypes => isinstance(x, basestring)
isinstance(x, types.StringTypes) => isinstance(x, basestring)
type(x) is types.StringType => isinstance(x, str)
type(x) == types.StringType => isinstance(x, str)
string.split(x, ...) => x.split(...)
string.join(x, y) => y.join(x)
string.zfill(x, ...) => x.zfill(...)
string.count(x, ...) => x.count(...)
hasattr(types, "UnicodeType") => try: unicode except NameError:
type(x) != types.TupleTuple => not isinstance(x, tuple)
isinstance(x, types.TupleType) => isinstance(x, tuple)
type(x) is types.IntType => isinstance(x, int)

Do not mention the string module in the rlcompleter docstring.

This partially applies SF patch http://www.python.org/sf/562373
(with basestring instead of string). (It excludes the changes to
unittest.py and does not change the os.stat stuff.)
diff --git a/Lib/StringIO.py b/Lib/StringIO.py
index bdf11cc..7c4b6c7 100644
--- a/Lib/StringIO.py
+++ b/Lib/StringIO.py
@@ -28,7 +28,6 @@
   bytes that occupy space in the buffer.
 - There's a simple test set (see end of this file).
 """
-import types
 try:
     from errno import EINVAL
 except ImportError:
@@ -50,7 +49,7 @@
     """
     def __init__(self, buf = ''):
         # Force self.buf to be a string or unicode
-        if not isinstance(buf, types.StringTypes):
+        if not isinstance(buf, basestring):
             buf = str(buf)
         self.buf = buf
         self.len = len(buf)
@@ -151,7 +150,7 @@
             raise ValueError, "I/O operation on closed file"
         if not s: return
         # Force s to be a string or unicode
-        if not isinstance(s, types.StringTypes):
+        if not isinstance(s, basestring):
             s = str(s)
         if self.pos > self.len:
             self.buflist.append('\0'*(self.pos - self.len))