diff --git a/django/test/testcases.py b/django/test/testcases.py
index 1239275..f4c1569 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -241,6 +241,40 @@ class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext):
 
 
 class SimpleTestCase(ut2.TestCase):
+    def __call__(self, result=None):
+        """
+        Wrapper around default __call__ method to perform common Django test
+        set up. This means that user-defined Test Cases aren't required to
+        include a call to super().setUp().
+        """
+        testMethod = getattr(self, self._testMethodName)
+        skipped = (getattr(self.__class__, "__unittest_skip__", False) or
+            getattr(testMethod, "__unittest_skip__", False))
+
+        if not skipped:
+            try:
+                self._pre_setup()
+            except (KeyboardInterrupt, SystemExit):
+                raise
+            except Exception:
+                result.addError(self, sys.exc_info())
+                return
+        super(SimpleTestCase, self).__call__(result)
+        if not skipped:
+            try:
+                self._post_teardown()
+            except (KeyboardInterrupt, SystemExit):
+                raise
+            except Exception:
+                result.addError(self, sys.exc_info())
+                return
+
+    def _pre_setup(self):
+        pass
+
+    def _post_teardown(self):
+        pass
+
     def save_warnings_state(self):
         """
         Saves the state of the warnings module
@@ -412,6 +446,7 @@ class TransactionTestCase(SimpleTestCase):
               ROOT_URLCONF with it.
             * Clearing the mail test outbox.
         """
+        self.client = self.client_class()
         self._fixture_setup()
         self._urlconf_setup()
         mail.outbox = []
@@ -453,35 +488,6 @@ class TransactionTestCase(SimpleTestCase):
             settings.ROOT_URLCONF = self.urls
             clear_url_caches()
 
-    def __call__(self, result=None):
-        """
-        Wrapper around default __call__ method to perform common Django test
-        set up. This means that user-defined Test Cases aren't required to
-        include a call to super().setUp().
-        """
-        testMethod = getattr(self, self._testMethodName)
-        skipped = (getattr(self.__class__, "__unittest_skip__", False) or
-            getattr(testMethod, "__unittest_skip__", False))
-
-        if not skipped:
-            self.client = self.client_class()
-            try:
-                self._pre_setup()
-            except (KeyboardInterrupt, SystemExit):
-                raise
-            except Exception:
-                result.addError(self, sys.exc_info())
-                return
-        super(TransactionTestCase, self).__call__(result)
-        if not skipped:
-            try:
-                self._post_teardown()
-            except (KeyboardInterrupt, SystemExit):
-                raise
-            except Exception:
-                result.addError(self, sys.exc_info())
-                return
-
     def _post_teardown(self):
         """ Performs any post-test things. This includes:
 
diff --git a/django/test/utils.py b/django/test/utils.py
index f10d388..8114ae0 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -187,8 +187,12 @@ class override_settings(object):
         self.disable()
 
     def __call__(self, test_func):
-        from django.test import TransactionTestCase
-        if isinstance(test_func, type) and issubclass(test_func, TransactionTestCase):
+        from django.test import SimpleTestCase
+        if isinstance(test_func, type):
+            if not issubclass(test_func, SimpleTestCase):
+                raise Exception(
+                    "Only subclasses of Django SimpleTestCase can be decorated "
+                    "with override_settings")
             original_pre_setup = test_func._pre_setup
             original_post_teardown = test_func._post_teardown
 
diff --git a/tests/regressiontests/settings_tests/tests.py b/tests/regressiontests/settings_tests/tests.py
index aaf8bcf..68f620b 100644
--- a/tests/regressiontests/settings_tests/tests.py
+++ b/tests/regressiontests/settings_tests/tests.py
@@ -4,8 +4,9 @@ import warnings
 from django.conf import settings, global_settings
 from django.core.exceptions import ImproperlyConfigured
 from django.http import HttpRequest
-from django.test import TransactionTestCase, TestCase, signals
+from django.test import SimpleTestCase, TransactionTestCase, TestCase, signals
 from django.test.utils import override_settings
+from django.utils import unittest, six
 
 
 @override_settings(TEST='override')
@@ -67,11 +68,6 @@ class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
             self.fail()
 
 
-class SettingGetter(object):
-    def __init__(self):
-        self.test = getattr(settings, 'TEST', 'undefined')
-
-
 class SettingsTests(TestCase):
     def setUp(self):
         self.testvalue = None
@@ -122,10 +118,20 @@ class SettingsTests(TestCase):
         self.assertRaises(AttributeError, getattr, settings, 'TEST')
 
     def test_class_decorator(self):
-        self.assertEqual(SettingGetter().test, 'undefined')
-        DecoratedSettingGetter = override_settings(TEST='override')(SettingGetter)
-        self.assertEqual(DecoratedSettingGetter().test, 'override')
-        self.assertRaises(AttributeError, getattr, settings, 'TEST')
+        # SimpleTestCase can be decorated by override_settings, but not ut.TestCase
+        class SimpleTestCaseSubclass(SimpleTestCase):
+            pass
+
+        class UnittestTestCaseSubclass(unittest.TestCase):
+            pass
+
+        decorated = override_settings(TEST='override')(SimpleTestCaseSubclass)
+        self.assertIsInstance(decorated, type)
+        self.assertTrue(issubclass(decorated, SimpleTestCase))
+
+        with six.assertRaisesRegex(self, Exception,
+                "Only subclasses of Django SimpleTestCase*"):
+            decorated = override_settings(TEST='override')(UnittestTestCaseSubclass)
 
     def test_signal_callback_context_manager(self):
         self.assertRaises(AttributeError, getattr, settings, 'TEST')
