diff --git a/.circleci/config.yml b/.circleci/config.yml
index 9d95e6ee..b555a052 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -75,6 +75,7 @@ workflows:
                  - "3.7"
                  - "3.8"
                  - "3.9"
+                 - "3.10"
       - test_nooptionals:
           matrix:
             parameters:
diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py
index 551c708d..8bccc609 100644
--- a/prometheus_client/exposition.py
+++ b/prometheus_client/exposition.py
@@ -34,7 +34,6 @@
 CONTENT_TYPE_LATEST = str('text/plain; version=0.0.4; charset=utf-8')
 """Content type of the latest text format"""
 PYTHON27_OR_OLDER = sys.version_info < (3, )
-PYTHON26_OR_OLDER = sys.version_info < (2, 7)
 PYTHON376_OR_NEWER = sys.version_info > (3, 7, 5)
 
 
@@ -445,7 +444,7 @@ def _use_gateway(method, gateway, job, registry, grouping_key, timeout, handler)
     gateway_url = urlparse(gateway)
     # See https://bugs.python.org/issue27657 for details on urlparse in py>=3.7.6.
     if not gateway_url.scheme or (
-            (PYTHON376_OR_NEWER or PYTHON26_OR_OLDER)
+            PYTHON376_OR_NEWER
             and gateway_url.scheme not in ['http', 'https']
     ):
         gateway = 'http://{0}'.format(gateway)
diff --git a/setup.py b/setup.py
index 0469f935..185d3524 100644
--- a/setup.py
+++ b/setup.py
@@ -1,13 +1,9 @@
 from os import path
-import sys
 
 from setuptools import setup
 
-if sys.version_info >= (2, 7):
-    with open(path.join(path.abspath(path.dirname(__file__)), 'README.md')) as f:
-        long_description = f.read()
-else:  # Assuming we don't run setup in order to publish under python 2.6
-    long_description = "NA"
+with open(path.join(path.abspath(path.dirname(__file__)), 'README.md')) as f:
+    long_description = f.read()
 
 
 setup(
@@ -47,6 +43,7 @@
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
         "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: 3.10",
         "Programming Language :: Python :: Implementation :: CPython",
         "Programming Language :: Python :: Implementation :: PyPy",
         "Topic :: System :: Monitoring",
diff --git a/tests/openmetrics/test_exposition.py b/tests/openmetrics/test_exposition.py
index 72578a0b..58ec05d9 100644
--- a/tests/openmetrics/test_exposition.py
+++ b/tests/openmetrics/test_exposition.py
@@ -1,7 +1,7 @@
 from __future__ import unicode_literals
 
-import sys
 import time
+import unittest
 
 from prometheus_client import (
     CollectorRegistry, Counter, Enum, Gauge, Histogram, Info, Metric, Summary,
@@ -11,12 +11,6 @@
 )
 from prometheus_client.openmetrics.exposition import generate_latest
 
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
-
 
 class TestGenerateText(unittest.TestCase):
     def setUp(self):
@@ -70,7 +64,6 @@ def test_summary(self):
 # EOF
 """, generate_latest(self.registry))
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_histogram(self):
         s = Histogram('hh', 'A histogram', registry=self.registry)
         s.observe(0.05)
diff --git a/tests/openmetrics/test_parser.py b/tests/openmetrics/test_parser.py
index 104547eb..8fd2319d 100644
--- a/tests/openmetrics/test_parser.py
+++ b/tests/openmetrics/test_parser.py
@@ -2,6 +2,7 @@
 
 import math
 import sys
+import unittest
 
 from prometheus_client.core import (
     CollectorRegistry, CounterMetricFamily, Exemplar,
@@ -12,12 +13,6 @@
 from prometheus_client.openmetrics.exposition import generate_latest
 from prometheus_client.openmetrics.parser import text_string_to_metric_families
 
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
-
 
 class TestParse(unittest.TestCase):
 
@@ -549,7 +544,6 @@ def test_fallback_to_state_machine_label_parsing(self):
                     mock2.assert_not_called()
                     mock3.assert_called_once_with('1')
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_roundtrip(self):
         text = """# HELP go_gc_duration_seconds A summary of the GC invocation durations.
 # TYPE go_gc_duration_seconds summary
diff --git a/tests/test_asgi.py b/tests/test_asgi.py
index 0f14bfc3..139c8717 100644
--- a/tests/test_asgi.py
+++ b/tests/test_asgi.py
@@ -1,16 +1,10 @@
 from __future__ import absolute_import, unicode_literals
 
-import sys
-from unittest import TestCase
+from unittest import skipUnless, TestCase
 
 from prometheus_client import CollectorRegistry, Counter
 from prometheus_client.exposition import CONTENT_TYPE_LATEST
 
-if sys.version_info < (2, 7):
-    from unittest2 import skipUnless
-else:
-    from unittest import skipUnless
-
 try:
     # Python >3.5 only
     import asyncio
diff --git a/tests/test_exposition.py b/tests/test_exposition.py
index 7bb404b5..757f1705 100644
--- a/tests/test_exposition.py
+++ b/tests/test_exposition.py
@@ -1,8 +1,8 @@
 from __future__ import unicode_literals
 
-import sys
 import threading
 import time
+import unittest
 
 import pytest
 
@@ -17,12 +17,6 @@
     passthrough_redirect_handler,
 )
 
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
-
 try:
     from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 except ImportError:
@@ -98,7 +92,6 @@ def test_summary(self):
 ss_created{a="c",b="d"} 123.456
 """, generate_latest(self.registry))
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_histogram(self):
         s = Histogram('hh', 'A histogram', registry=self.registry)
         s.observe(0.05)
diff --git a/tests/test_gc_collector.py b/tests/test_gc_collector.py
index c0cda88f..00714422 100644
--- a/tests/test_gc_collector.py
+++ b/tests/test_gc_collector.py
@@ -3,12 +3,7 @@
 import gc
 import platform
 import sys
-
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
+import unittest
 
 from prometheus_client import CollectorRegistry, GCCollector
 
diff --git a/tests/test_multiprocess.py b/tests/test_multiprocess.py
index 96792a36..310f8c77 100644
--- a/tests/test_multiprocess.py
+++ b/tests/test_multiprocess.py
@@ -3,8 +3,8 @@
 import glob
 import os
 import shutil
-import sys
 import tempfile
+import unittest
 import warnings
 
 from prometheus_client import mmap_dict, values
@@ -18,12 +18,6 @@
     get_value_class, MultiProcessValue, MutexValue,
 )
 
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
-
 
 class TestMultiProcessDeprecation(unittest.TestCase):
     def setUp(self):
@@ -196,7 +190,6 @@ def files():
         c3 = Counter('c3', 'c3', registry=None)
         self.assertEqual(files(), ['counter_0.db', 'counter_1.db'])
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_collect(self):
         pid = 0
         values.ValueClass = MultiProcessValue(lambda: pid)
@@ -257,7 +250,6 @@ def add_label(key, value):
 
         self.assertEqual(metrics['h'].samples, expected_histogram)
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_merge_no_accumulate(self):
         pid = 0
         values.ValueClass = MultiProcessValue(lambda: pid)
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 44a3fa45..780f0bc7 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -1,7 +1,7 @@
 from __future__ import unicode_literals
 
 import math
-import sys
+import unittest
 
 from prometheus_client.core import (
     CollectorRegistry, CounterMetricFamily, GaugeMetricFamily,
@@ -10,12 +10,6 @@
 from prometheus_client.exposition import generate_latest
 from prometheus_client.parser import text_string_to_metric_families
 
-if sys.version_info < (2, 7):
-    # We need the skip decorators from unittest2 on Python 2.6.
-    import unittest2 as unittest
-else:
-    import unittest
-
 
 class TestParse(unittest.TestCase):
     def assertEqualMetrics(self, first, second, msg=None):
@@ -289,7 +283,6 @@ def test_timestamps(self):
         b.add_metric([], 88, timestamp=1234566)
         self.assertEqualMetrics([a, b], list(families))
 
-    @unittest.skipIf(sys.version_info < (2, 7), "Test requires Python 2.7+.")
     def test_roundtrip(self):
         text = """# HELP go_gc_duration_seconds A summary of the GC invocation durations.
 # TYPE go_gc_duration_seconds summary
diff --git a/tests/test_twisted.py b/tests/test_twisted.py
index 110aded7..ea1796f4 100644
--- a/tests/test_twisted.py
+++ b/tests/test_twisted.py
@@ -1,14 +1,9 @@
 from __future__ import absolute_import, unicode_literals
 
-import sys
+from unittest import skipUnless
 
 from prometheus_client import CollectorRegistry, Counter, generate_latest
 
-if sys.version_info < (2, 7):
-    from unittest2 import skipUnless
-else:
-    from unittest import skipUnless
-
 try:
     from twisted.internet import reactor
     from twisted.trial.unittest import TestCase
diff --git a/tests/test_wsgi.py b/tests/test_wsgi.py
index 79fea884..7a285a9c 100644
--- a/tests/test_wsgi.py
+++ b/tests/test_wsgi.py
@@ -22,17 +22,6 @@ def capture(self, status, header):
         self.captured_status = status
         self.captured_headers = header
 
-    def assertIn(self, item, iterable):
-        try:
-            super().assertIn(item, iterable)
-        except:  # Python < 2.7
-            self.assertTrue(
-                item in iterable,
-                msg="{item} not found in {iterable}".format(
-                    item=item, iterable=iterable
-                )
-            )
-
     def validate_metrics(self, metric_name, help_text, increments):
         """
         WSGI app serves the metrics from the provided registry.
diff --git a/tox.ini b/tox.ini
index 8b2105c7..29845187 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = coverage-clean,py2.7,py3.4,py3.5,py3.6,py3.7,py3.8,py3.9,pypy2.7,pypy3.7,{py2.7,py3.9}-nooptionals,coverage-report,flake8,isort
+envlist = coverage-clean,py2.7,py3.4,py3.5,py3.6,py3.7,py3.8,py3.9,py3.10,pypy2.7,pypy3.7,{py2.7,py3.9}-nooptionals,coverage-report,flake8,isort
 
 
 [base]