diff --git a/django/test/testcases.py b/django/test/testcases.py
index 3ce96b0..bf3b161 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -159,6 +159,19 @@ class SimpleTestCase(unittest.TestCase):
     client_class = Client
     _custom_settings = None
 
+    @classmethod
+    def setUpClass(cls):
+        if cls._custom_settings:
+            cls._cls_overridden = override_settings(**cls._custom_settings)
+            cls._cls_overridden.enable()
+        super(SimpleTestCase, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(SimpleTestCase, cls).tearDownClass()
+        if cls._custom_settings:
+            cls._cls_overridden.disable()
+
     def __call__(self, result=None):
         """
         Wrapper around default __call__ method to perform common Django test
diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py
index 4a0c363..236f8b4 100644
--- a/tests/settings_tests/tests.py
+++ b/tests/settings_tests/tests.py
@@ -54,9 +54,17 @@ class ClassDecoratedTestCaseSuper(TestCase):
 
 @override_settings(TEST='override')
 class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
+    @classmethod
+    def setUpClass(cls):
+        super(cls, ClassDecoratedTestCase).setUpClass()
+        cls.foo = getattr(settings, 'TEST', 'BUG')
+
     def test_override(self):
         self.assertEqual(settings.TEST, 'override')
 
+    def test_setupclass_override(self):
+        self.assertNotEqual(self.foo, 'BUG')
+
     @override_settings(TEST='override2')
     def test_method_override(self):
         self.assertEqual(settings.TEST, 'override2')
