diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index a1c21d3..8098681 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -839,8 +839,8 @@
         if self.closed:
             raise ValueError("seek on closed file")
         try:
-            pos = pos.__index__()
-        except AttributeError as err:
+            pos.__index__
+        except AttributeError:
             raise TypeError("an integer is required")
         if whence == 0:
             if pos < 0:
@@ -864,8 +864,13 @@
             raise ValueError("truncate on closed file")
         if pos is None:
             pos = self._pos
-        elif pos < 0:
-            raise ValueError("negative truncate position %r" % (pos,))
+        else:
+            try:
+                pos.__index__
+            except AttributeError:
+                raise TypeError("an integer is required")
+            if pos < 0:
+                raise ValueError("negative truncate position %r" % (pos,))
         del self._buffer[pos:]
         return pos
 
@@ -1813,6 +1818,10 @@
         if n is None:
             n = -1
         decoder = self._decoder or self._get_decoder()
+        try:
+            n.__index__
+        except AttributeError:
+            raise TypeError("an integer is required")
         if n < 0:
             # Read everything.
             result = (self._get_decoded_chars() +
diff --git a/Lib/calendar.py b/Lib/calendar.py
index ab14c7d..2e45e24 100644
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -564,6 +564,10 @@
 firstweekday = c.getfirstweekday
 
 def setfirstweekday(firstweekday):
+    try:
+        firstweekday.__index__
+    except AttributeError:
+        raise IllegalWeekdayError(firstweekday)
     if not MONDAY <= firstweekday <= SUNDAY:
         raise IllegalWeekdayError(firstweekday)
     c.firstweekday = firstweekday
diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py
index 6f517b1..c758d56 100644
--- a/Lib/ctypes/test/test_callbacks.py
+++ b/Lib/ctypes/test/test_callbacks.py
@@ -132,7 +132,7 @@
         gc.collect()
         live = [x for x in gc.get_objects()
                 if isinstance(x, X)]
-        self.failUnlessEqual(len(live), 0)
+        self.assertEqual(len(live), 0)
 
 try:
     WINFUNCTYPE
@@ -164,7 +164,7 @@
         result = integrate(0.0, 1.0, CALLBACK(func), 10)
         diff = abs(result - 1./3.)
 
-        self.assertTrue(diff < 0.01, "%s not less than 0.01" % diff)
+        self.assertLess(diff, 0.01, "%s not less than 0.01" % diff)
 
 ################################################################
 
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index 36ac721..1a55f70 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -406,7 +406,7 @@
 
     log.info(msg)
     if not dry_run:
-        apply(func, args)
+        func(*args)
 
 
 def strtobool (val):
diff --git a/Lib/shutil.py b/Lib/shutil.py
index 0cc9262..df571e7 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -10,6 +10,7 @@
 from os.path import abspath
 import fnmatch
 from warnings import warn
+import collections
 
 try:
     from pwd import getpwnam
@@ -500,7 +501,7 @@
     """
     if extra_args is None:
         extra_args = []
-    if not callable(function):
+    if not isinstance(function, collections.Callable):
         raise TypeError('The %s object is not callable' % function)
     if not isinstance(extra_args, (tuple, list)):
         raise TypeError('extra_args needs to be a sequence')
diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py
index 39d4fe8..fad517c 100644
--- a/Lib/test/test_calendar.py
+++ b/Lib/test/test_calendar.py
@@ -212,11 +212,9 @@
         self.assertEqual(calendar.isleap(2003), 0)
 
     def test_setfirstweekday(self):
-        # Silence a py3k warning claiming to affect Lib/calendar.py
-        with test_support.check_warnings():
-            self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber')
-            self.assertRaises(ValueError, calendar.setfirstweekday, -1)
-            self.assertRaises(ValueError, calendar.setfirstweekday, 200)
+        self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber')
+        self.assertRaises(ValueError, calendar.setfirstweekday, -1)
+        self.assertRaises(ValueError, calendar.setfirstweekday, 200)
         orig = calendar.firstweekday()
         calendar.setfirstweekday(calendar.SUNDAY)
         self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
index 13fa826..2b4c76e 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -133,9 +133,7 @@
         pos = memio.tell()
         self.assertEqual(memio.truncate(None), pos)
         self.assertEqual(memio.tell(), pos)
-        # Silence a py3k warning
-        with support.check_warnings():
-            self.assertRaises(TypeError, memio.truncate, '0')
+        self.assertRaises(TypeError, memio.truncate, '0')
         memio.close()
         self.assertRaises(ValueError, memio.truncate, 0)
 
@@ -172,9 +170,7 @@
         self.assertEqual(type(memio.read()), type(buf))
         memio.seek(0)
         self.assertEqual(memio.read(None), buf)
-        # Silence a py3k warning
-        with support.check_warnings():
-            self.assertRaises(TypeError, memio.read, '')
+        self.assertRaises(TypeError, memio.read, '')
         memio.close()
         self.assertRaises(ValueError, memio.read)
 
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index 88d1bec..aacd67c 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -774,26 +774,23 @@
         set(actual))`` but it works with sequences of unhashable objects as
         well.
         """
-        try:
-            expected = set(expected_seq)
-            actual = set(actual_seq)
-            missing = list(expected.difference(actual))
-            unexpected = list(actual.difference(expected))
-            missing.sort()
-            unexpected.sort()
-        except TypeError:
-            # Fall back to slower list-compare if any of the objects are
-            # not hashable.
-            expected = list(expected_seq)
-            actual = list(actual_seq)
-            with warnings.catch_warnings():
-                if sys.py3kwarning:
-                    # Silence Py3k warning
-                    warnings.filterwarnings("ignore",
-                                            "dict inequality comparisons "
-                                            "not supported", DeprecationWarning)
-                expected.sort()
-                actual.sort()
+        with warnings.catch_warnings():
+            if sys.py3kwarning:
+                # Silence Py3k warning raised during the sorting
+                for msg in ["dict inequality comparisons",
+                            "builtin_function_or_method order comparisons",
+                            "comparing unequal types"]:
+                    warnings.filterwarnings("ignore", msg, DeprecationWarning)
+            try:
+                expected = set(expected_seq)
+                actual = set(actual_seq)
+                missing = sorted(expected.difference(actual))
+                unexpected = sorted(actual.difference(expected))
+            except TypeError:
+                # Fall back to slower list-compare if any of the objects are
+                # not hashable.
+                expected = sorted(expected_seq)
+                actual = sorted(actual_seq)
                 missing, unexpected = sorted_list_difference(expected, actual)
         errors = []
         if missing:
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 70b3d43..134ba13 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -29,7 +29,7 @@
         file.write(formatwarning(message, category, filename, lineno, line))
     except IOError:
         pass # the file (probably stderr) is invalid - this warning gets lost.
-# Keep a worrking version around in case the deprecation of the old API is
+# Keep a working version around in case the deprecation of the old API is
 # triggered.
 showwarning = _show_warning
 
