diff --git a/django/core/paginator.py b/django/core/paginator.py
index 6c502ae..2909494 100644
--- a/django/core/paginator.py
+++ b/django/core/paginator.py
@@ -1,6 +1,8 @@
 import collections
 from math import ceil
 
+from django.utils import six
+
 class InvalidPage(Exception):
     pass
 
@@ -91,6 +93,8 @@ class Page(collections.Sequence):
     def __getitem__(self, index):
         # The object_list is converted to a list so that if it was a QuerySet
         # it won't be a database hit per __getitem__.
+        if not isinstance(index, (slice,) + six.integer_types):
+            raise TypeError
         return list(self.object_list)[index]
 
     def has_next(self):
diff --git a/tests/regressiontests/pagination/tests.py b/tests/regressiontests/pagination/tests.py
index a49f9b8..440c731 100644
--- a/tests/regressiontests/pagination/tests.py
+++ b/tests/regressiontests/pagination/tests.py
@@ -266,3 +266,23 @@ class ModelPaginationTests(TestCase):
         self.assertEqual(1, p.previous_page_number())
         self.assertEqual(6, p.start_index())
         self.assertEqual(9, p.end_index())
+
+    def test_page_getitem(self):
+        """
+        Tests that a paginator page raises the correct exception when slicing it.
+        """
+        paginator = Paginator(Article.objects.all(), 5)
+        p = paginator.page(1)
+
+        # Make sure object_list queryset is not evaluated by an invalid __getitem__ call.
+        # (this happens from the template engine when using eg: {% page_obj.has_previous %}
+        self.assertEqual(p.object_list._result_cache, None)
+        self.assertRaises(TypeError, lambda: p['has_previous'])
+        self.assertEqual(p.object_list._result_cache, None)
+
+        # Make sure slicing the Page object with numbers and slice objects work.
+        self.assertEqual(p[0], Article.objects.get(headline='Article 1'))
+        self.assertEqual(p[slice(2)], [
+            Article.objects.get(headline='Article 1'),
+            Article.objects.get(headline='Article 2')
+        ])
