Index: twisted/test/test_defgen.py
===================================================================
--- twisted/test/test_defgen.py	(revision 33739)
+++ twisted/test/test_defgen.py	(working copy)
@@ -175,9 +175,6 @@
 
 
 
-## This has to be in a string so the new yield syntax doesn't cause a
-## syntax error in Python 2.4 and before.
-inlineCallbacksTestsSource = '''
 from twisted.internet.defer import inlineCallbacks, returnValue
 
 class InlineCallbacksTests(BaseDefgenTests, unittest.TestCase):
@@ -295,15 +292,3 @@
 
         self.assertIn("inlineCallbacks",
             str(self.assertRaises(TypeError, _noYield)))
-
-'''
-
-if sys.version_info > (2, 5):
-    # Load tests
-    exec inlineCallbacksTestsSource
-else:
-    # Make a placeholder test case
-    class InlineCallbacksTests(unittest.TestCase):
-        skip = "defer.defgen doesn't run on python < 2.5."
-        def test_everything(self):
-            pass
Index: twisted/python/util.py
===================================================================
--- twisted/python/util.py	(revision 33739)
+++ twisted/python/util.py	(working copy)
@@ -790,10 +790,10 @@
     Return the id of an object as an unsigned number so that its hex
     representation makes sense.
 
-    This is mostly necessary in Python 2.4 which implements L{id} to sometimes
-    return a negative value.  Python 2.3 shares this behavior, but also
+    This is mostly necessary in Python 2.4 which implements L{id} to sometimes 
+    return a negative value.  Python 2.3 shares this behavior, but also 
     implements hex and the %x format specifier to represent negative values as
-    though they were positive ones, obscuring the behavior of L{id}.  Python
+    though they were positive ones, obscuring the behavior of L{id}.  Python 
     2.5's implementation of L{id} always returns positive values.
     """
     rval = _idFunction(obj)
Index: twisted/trial/test/mockdoctest.py
===================================================================
--- twisted/trial/test/mockdoctest.py	(revision 33739)
+++ twisted/trial/test/mockdoctest.py	(working copy)
@@ -2,7 +2,7 @@
 # See LICENSE for details.
 
 # this module is a trivial class with doctests and a __test__ attribute
-# to test trial's doctest support with python2.4
+# to test trial's doctest support.
 
 
 class Counter(object):
Index: twisted/trial/runner.py
===================================================================
--- twisted/trial/runner.py	(revision 33739)
+++ twisted/trial/runner.py	(working copy)
@@ -11,7 +11,7 @@
 __all__ = [
     'suiteVisit', 'TestSuite',
 
-    'DestructiveTestSuite', 'DocTestCase', 'DryRunVisitor',
+    'DestructiveTestSuite', 'DryRunVisitor',
     'ErrorHolder', 'LoggedSuite', 'PyUnitTestCase',
     'TestHolder', 'TestLoader', 'TrialRunner', 'TrialSuite',
 
@@ -239,22 +239,6 @@
 
 
 
-class DocTestCase(PyUnitTestCase):
-    """
-    DEPRECATED in Twisted 8.0.
-    """
-
-    def id(self):
-        """
-        In Python 2.4, doctests have correct id() behaviour. In Python 2.3,
-        id() returns 'runit'.
-
-        Here we override id() so that at least it will always contain the
-        fully qualified Python name of the doctest.
-        """
-        return self._test.shortDescription()
-
-
 class TrialSuite(TestSuite):
     """
     Suite to wrap around every single test in a C{trial} run. Used internally
Index: twisted/trial/util.py
===================================================================
--- twisted/trial/util.py	(revision 33739)
+++ twisted/trial/util.py	(working copy)
@@ -208,26 +208,15 @@
 
 def profiled(f, outputFile):
     def _(*args, **kwargs):
-        if sys.version_info[0:2] != (2, 4):
-            import profile
-            prof = profile.Profile()
-            try:
-                result = prof.runcall(f, *args, **kwargs)
-                prof.dump_stats(outputFile)
-            except SystemExit:
-                pass
-            prof.print_stats()
-            return result
-        else: # use hotshot, profile is broken in 2.4
-            import hotshot.stats
-            prof = hotshot.Profile(outputFile)
-            try:
-                return prof.runcall(f, *args, **kwargs)
-            finally:
-                stats = hotshot.stats.load(outputFile)
-                stats.strip_dirs()
-                stats.sort_stats('cum')   # 'time'
-                stats.print_stats(100)
+        import profile
+        prof = profile.Profile()
+        try:
+            result = prof.runcall(f, *args, **kwargs)
+            prof.dump_stats(outputFile)
+        except SystemExit:
+            pass
+        prof.print_stats()
+        return result
     return _
 
 
Index: twisted/trial/unittest.py
===================================================================
--- twisted/trial/unittest.py	(revision 33739)
+++ twisted/trial/unittest.py	(working copy)
@@ -1392,28 +1392,11 @@
 class TestSuite(pyunit.TestSuite):
     """
     Extend the standard library's C{TestSuite} with support for the visitor
-    pattern and a consistently overrideable C{run} method.
+    pattern.
     """
 
     visit = suiteVisit
 
-    def __call__(self, result):
-        return self.run(result)
-
-
-    def run(self, result):
-        """
-        Call C{run} on every member of the suite.
-        """
-        # we implement this because Python 2.3 unittest defines this code
-        # in __call__, whereas 2.4 defines the code in run.
-        for test in self._tests:
-            if result.shouldStop:
-                break
-            test(result)
-        return result
-
-
 
 class TestDecorator(components.proxyForInterface(itrial.ITestCase,
                                                  "_originalTest")):
Index: twisted/web/test/test_xmlrpc.py
===================================================================
--- twisted/web/test/test_xmlrpc.py	(revision 33739)
+++ twisted/web/test/test_xmlrpc.py	(working copy)
@@ -575,15 +575,6 @@
     value = None
 
 
-try:
-    xmlrpclib.loads(xmlrpclib.dumps(({}, {})), use_datetime=True)
-except TypeError:
-    _datetimeSupported = False
-else:
-    _datetimeSupported = True
-
-
-
 class XMLRPCUseDateTimeTestCase(SerializationConfigMixin, unittest.TestCase):
     """
     Tests for passing a C{datetime.datetime} instance when the C{useDateTime}
@@ -592,41 +583,6 @@
     flagName = "useDateTime"
     value = datetime.datetime(2000, 12, 28, 3, 45, 59)
 
-    if not _datetimeSupported:
-        skip = (
-            "Available version of xmlrpclib does not support datetime "
-            "objects.")
-
-
-
-class XMLRPCDisableUseDateTimeTestCase(unittest.TestCase):
-    """
-    Tests for the C{useDateTime} flag on Python 2.4.
-    """
-    if _datetimeSupported:
-        skip = (
-            "Available version of xmlrpclib supports datetime objects.")
-
-    def test_cannotInitializeWithDateTime(self):
-        """
-        L{XMLRPC} raises L{RuntimeError} if passed C{True} for C{useDateTime}.
-        """
-        self.assertRaises(RuntimeError, XMLRPC, useDateTime=True)
-        self.assertRaises(
-            RuntimeError, Proxy, "http://localhost/", useDateTime=True)
-
-
-    def test_cannotSetDateTime(self):
-        """
-        Setting L{XMLRPC.useDateTime} to C{True} after initialization raises
-        L{RuntimeError}.
-        """
-        xmlrpc = XMLRPC(useDateTime=False)
-        self.assertRaises(RuntimeError, setattr, xmlrpc, "useDateTime", True)
-        proxy = Proxy("http://localhost/", useDateTime=False)
-        self.assertRaises(RuntimeError, setattr, proxy, "useDateTime", True)
-
-
 
 class XMLRPCTestAuthenticated(XMLRPCTestCase):
     """
Index: twisted/web/xmlrpc.py
===================================================================
--- twisted/web/xmlrpc.py	(revision 33739)
+++ twisted/web/xmlrpc.py	(working copy)
@@ -28,11 +28,6 @@
 Boolean = xmlrpclib.Boolean
 DateTime = xmlrpclib.DateTime
 
-# On Python 2.4 and earlier, DateTime.decode returns unicode.
-if sys.version_info[:2] < (2, 5):
-    _decode = DateTime.decode
-    DateTime.decode = lambda self, value: _decode(self, value.encode('ascii'))
-
 
 def withRequest(f):
     """
@@ -128,8 +123,6 @@
 
 
     def __setattr__(self, name, value):
-        if name == "useDateTime" and value and sys.version_info[:2] < (2, 5):
-            raise RuntimeError("useDateTime requires Python 2.5 or later.")
         self.__dict__[name] = value
 
 
Index: twisted/web/client.py
===================================================================
--- twisted/web/client.py	(revision 33739)
+++ twisted/web/client.py	(working copy)
@@ -720,9 +720,8 @@
     """
     implements(IBodyProducer)
 
-    # Python 2.4 doesn't have these symbolic constants
-    _SEEK_SET = getattr(os, 'SEEK_SET', 0)
-    _SEEK_END = getattr(os, 'SEEK_END', 2)
+    _SEEK_SET = os.SEEK_SET
+    _SEEK_END = os.SEEK_END
 
     def __init__(self, inputFile, cooperator=task, readSize=2 ** 16):
         self._inputFile = inputFile
