diff --git a/README.rst b/README.rst
index c033fcd..a77d3c4 100644
--- a/README.rst
+++ b/README.rst
@@ -11,58 +11,57 @@
 
 .. code:: python
 
-    # test_math.py
-    from nose.tools import assert_equal
-    from parameterized import parameterized
+   # test_math.py
+   from nose.tools import assert_equal
+   from parameterized import parameterized, parameterized_class
 
-    import unittest
-    import math
+   import unittest
+   import math
 
-    @parameterized([
-        (2, 2, 4),
-        (2, 3, 8),
-        (1, 9, 1),
-        (0, 9, 0),
-    ])
-    def test_pow(base, exponent, expected):
-        assert_equal(math.pow(base, exponent), expected)
+   @parameterized([
+       (2, 2, 4),
+       (2, 3, 8),
+       (1, 9, 1),
+       (0, 9, 0),
+   ])
+   def test_pow(base, exponent, expected):
+      assert_equal(math.pow(base, exponent), expected)
 
-    class TestMathUnitTest(unittest.TestCase):
-        @parameterized.expand([
-            ("negative", -1.5, -2.0),
-            ("integer", 1, 1.0),
-            ("large fraction", 1.6, 1),
-        ])
-        def test_floor(self, name, input, expected):
-            assert_equal(math.floor(input), expected)
+   class TestMathUnitTest(unittest.TestCase):
+      @parameterized.expand([
+          ("negative", -1.5, -2.0),
+          ("integer", 1, 1.0),
+          ("large fraction", 1.6, 1),
+      ])
+      def test_floor(self, name, input, expected):
+          assert_equal(math.floor(input), expected)
 
-    @parameterized.parameterized_class(('a', 'b', 'c'), [
-        (0, 5, 6),
-        (None, None, None),
-        ({}, [], [])
-    ])
-    class TestMathClass(unittest.TestCase):
-        def _assertions(self):
-            assert hasattr(self, 'a')
-            assert hasattr(self, 'b')
-            assert hasattr(self, 'c')
+   @parameterized_class(('a', 'b', 'expected_sum', 'expected_product'), [
+      (1, 2, 3, 2),
+      (5, 5, 10, 25),
+   ])
+   class TestMathClass(unittest.TestCase):
+      def test_add(self):
+         assert_equal(self.a + self.b, self.expected_sum)
 
-        def test_method_a(self):
-            self._assertions()
+      def test_multiply(self):
+         assert_equal(self.a * self.b, self.expected_product)
 
-        def test_method_b(self):
-            self._assertions()
+   @parameterized_class([
+      { "a": 3, "expected": 2 },
+      { "b": 5, "expected": -4 },
+   ])
+   class TestMathClassDict(unittest.TestCase):
+      a = 1
+      b = 1
+
+      def test_subtract(self):
+         assert_equal(self.a - self.b, self.expected)
 
 
 With nose (and nose2)::
 
     $ nosetests -v test_math.py
-    test_method_a (test_math.TestMathClass_1) ... ok
-    test_method_b (test_math.TestMathClass_1) ... ok
-    test_method_a (test_math.TestMathClass_2) ... ok
-    test_method_b (test_math.TestMathClass_2) ... ok
-    test_method_a (test_math.TestMathClass_3) ... ok
-    test_method_b (test_math.TestMathClass_3) ... ok
     test_floor_0_negative (test_math.TestMathUnitTest) ... ok
     test_floor_1_integer (test_math.TestMathUnitTest) ... ok
     test_floor_2_large_fraction (test_math.TestMathUnitTest) ... ok
@@ -70,9 +69,14 @@
     test_math.test_pow(2, 3, 8, {}) ... ok
     test_math.test_pow(1, 9, 1, {}) ... ok
     test_math.test_pow(0, 9, 0, {}) ... ok
+    test_add (test_math.TestMathClass_0) ... ok
+    test_multiply (test_math.TestMathClass_0) ... ok
+    test_add (test_math.TestMathClass_1) ... ok
+    test_multiply (test_math.TestMathClass_1) ... ok
+    test_subtract (test_math.TestMathClassDict_0) ... ok
 
     ----------------------------------------------------------------------
-    Ran 13 tests in 0.015s
+    Ran 12 tests in 0.015s
 
     OK
 
@@ -87,12 +91,6 @@
     platform darwin -- Python 3.6.1, pytest-3.1.3, py-1.4.34, pluggy-0.4.0
     collecting ... collected 13 items
 
-    test_math.py::TestMathClass_1::test_method_a PASSED
-    test_math.py::TestMathClass_1::test_method_b PASSED
-    test_math.py::TestMathClass_2::test_method_a PASSED
-    test_math.py::TestMathClass_2::test_method_b PASSED
-    test_math.py::TestMathClass_3::test_method_a PASSED
-    test_math.py::TestMathClass_3::test_method_b PASSED
     test_math.py::test_pow::[0] PASSED
     test_math.py::test_pow::[1] PASSED
     test_math.py::test_pow::[2] PASSED
@@ -100,23 +98,27 @@
     test_math.py::TestMathUnitTest::test_floor_0_negative PASSED
     test_math.py::TestMathUnitTest::test_floor_1_integer PASSED
     test_math.py::TestMathUnitTest::test_floor_2_large_fraction PASSED
-    ==================== 13 passed, 4 warnings in 0.16 seconds =====================
+    test_math.py::TestMathClass_0::test_add PASSED
+    test_math.py::TestMathClass_0::test_multiply PASSED
+    test_math.py::TestMathClass_1::test_add PASSED
+    test_math.py::TestMathClass_1::test_multiply PASSED
+    test_math.py::TestMathClassDict_0::test_subtract PASSED
+    ==================== 12 passed, 4 warnings in 0.16 seconds =====================
 
 With unittest (and unittest2)::
 
     $ python -m unittest -v test_math
-    test_method_a (test_math.TestMathClass_1) ... ok
-    test_method_b (test_math.TestMathClass_1) ... ok
-    test_method_a (test_math.TestMathClass_2) ... ok
-    test_method_b (test_math.TestMathClass_2) ... ok
-    test_method_a (test_math.TestMathClass_3) ... ok
-    test_method_b (test_math.TestMathClass_3) ... ok
     test_floor_0_negative (test_math.TestMathUnitTest) ... ok
     test_floor_1_integer (test_math.TestMathUnitTest) ... ok
     test_floor_2_large_fraction (test_math.TestMathUnitTest) ... ok
+    test_add (test_math.TestMathClass_0) ... ok
+    test_multiply (test_math.TestMathClass_0) ... ok
+    test_add (test_math.TestMathClass_1) ... ok
+    test_multiply (test_math.TestMathClass_1) ... ok
+    test_subtract (test_math.TestMathClassDict_0) ... ok
 
     ----------------------------------------------------------------------
-    Ran 9 tests in 0.001s
+    Ran 8 tests in 0.001s
 
     OK
 
@@ -140,8 +142,16 @@
     .   test_floor_0_negative
     .   test_floor_1_integer
     .   test_floor_2_large_fraction
+      TestMathClass_0
+    .   test_add
+    .   test_multiply
+      TestMathClass_1
+    .   test_add
+    .   test_multiply
+      TestMathClassDict_0
+    .   test_subtract
 
-    Ran 9 tests in 0.121s
+    Ran 12 tests in 0.121s
 
     OK (passes=9)
 
@@ -168,8 +178,10 @@
    * -
      - Py2.6
      - Py2.7
-     - Py3.3
      - Py3.4
+     - Py3.5
+     - Py3.6
+     - Py3.7
      - PyPy
    * - nose
      - yes
@@ -177,18 +189,24 @@
      - yes
      - yes
      - yes
+     - yes
+     - yes
    * - nose2
      - yes
      - yes
      - yes
      - yes
      - yes
+     - yes
+     - yes
    * - py.test
      - yes
      - yes
      - yes
      - yes
      - yes
+     - yes
+     - yes
    * - | unittest
        | (``@parameterized.expand``)
      - yes
@@ -196,6 +214,8 @@
      - yes
      - yes
      - yes
+     - yes
+     - yes
    * - | unittest2
        | (``@parameterized.expand``)
      - yes
@@ -203,6 +223,8 @@
      - yes
      - yes
      - yes
+     - yes
+     - yes
 
 Dependencies
 ------------
@@ -409,33 +431,47 @@
 
     OK
 
-Finally ``@parameterized.expand_class`` parameterizes an entire class:
+Finally ``@parameterized.expand_class`` parameterizes an entire class, using
+either a list of attributes, or a list of dicts that will be applied to the
+class:
 
 .. code:: python
 
-    from app.models import User
-    from django.test import TestCase
-    from parameterized import parameterized
+   from yourapp.models import User
+   from parameterized import parameterized_class
 
-    @parameterized.parameterized_class(('username', 'access_level'), [
-        ('user_1', 1),
-        ('user_2', 2)
-    ])
-    class TestUserAccessLevel(TestCase):
-        def setUp(self):
-            self.client.force_login(User.objects.get(username=self.username)[0])
+   @parameterized_class(("username", "access_level", "expected_status_code"), [
+      ("user_1", 1, 200),
+      ("user_2", 2, 404)
+   ])
+   class TestUserAccessLevel(TestCase):
+      def setUp(self):
+         self.client.force_login(User.objects.get(username=self.username)[0])
 
-        def test_url_a(self):
-            response = self.client.get('/url')
-            if(self.access_level == 1):
-                self.assertEqual(response.status_code, 200)
-            else:
-                self.assertNotEqual(response.status_code, 200)
+      def test_url_a(self):
+         response = self.client.get("/url")
+         self.assertEqual(response.status_code, self.expected_status_code)
 
-        def tearDown(self):
-            self.client.logout()
+      def tearDown(self):
+         self.client.logout()
 
 
+   @parameterized_class([
+      { "username": "user_1", "access_level": 1 },
+      { "username": "user_2", "access_level": 2, "expected_status_code": 404 },
+   ])
+   class TestUserAccessLevel(TestCase):
+      expected_status_code = 200
+
+      def setUp(self):
+         self.client.force_login(User.objects.get(username=self.username)[0])
+
+      def test_url_a(self):
+         response = self.client.get('/url')
+         self.assertEqual(response.status_code, self.expected_status_code)
+
+      def tearDown(self):
+         self.client.logout()
 
 
 Migrating from ``nose-parameterized`` to ``parameterized``
