diff --git a/bot/reviewbot/config.py b/bot/reviewbot/config.py
index 2219fcdf56976f4a6e237e8bc88375a2a13ac41b..3342ff6871e14551a00cdbe72f15ee6f62a41c45 100644
--- a/bot/reviewbot/config.py
+++ b/bot/reviewbot/config.py
@@ -6,7 +6,6 @@ import json
 import os
 from copy import deepcopy
 
-import six
 from appdirs import AppDirs
 
 from reviewbot.utils.log import get_root_logger
@@ -128,7 +127,7 @@ def load_config():
                 config_module = {}
                 exec(compile(f.read(), config_file, 'exec'), config_module)
 
-            for key in six.iterkeys(DEFAULT_CONFIG):
+            for key in DEFAULT_CONFIG.keys():
                 if key in config_module:
                     new_config[key] = deepcopy(config_module[key])
 
diff --git a/bot/reviewbot/processing/review.py b/bot/reviewbot/processing/review.py
index 4ba5b6ef56a58759c8fcff3bdd6a902e77cb3624..46e73e2904a8d7401c7b6d34e1ee4639eec017b2 100644
--- a/bot/reviewbot/processing/review.py
+++ b/bot/reviewbot/processing/review.py
@@ -5,7 +5,6 @@ import os
 from enum import Enum
 from itertools import islice
 
-import six
 from rbtools.api.errors import APIError
 
 from reviewbot.utils.filesystem import (ensure_dirs_exist,
@@ -116,7 +115,7 @@ class File(object):
         try:
             contents = self._api_filediff.get_patched_file().data
 
-            if isinstance(contents, six.text_type):
+            if isinstance(contents, str):
                 contents = contents.encode('utf-8')
 
             return contents
@@ -151,7 +150,7 @@ class File(object):
         try:
             contents = self._api_filediff.get_original_file().data
 
-            if isinstance(contents, six.text_type):
+            if isinstance(contents, str):
                 contents = contents.encode('utf-8')
 
             return contents
@@ -268,7 +267,7 @@ class File(object):
             ),
             num_lines))
 
-        assert not result or isinstance(result[0], six.text_type)
+        assert not result or isinstance(result[0], str)
 
         return result
 
diff --git a/bot/reviewbot/repositories.py b/bot/reviewbot/repositories.py
index d9aa16fca30baf54ec274b2ecbb4489fee455932..371e2edb71ce7df2650cd49805bdbd1ab8958ece 100644
--- a/bot/reviewbot/repositories.py
+++ b/bot/reviewbot/repositories.py
@@ -6,7 +6,6 @@ import os
 from uuid import uuid4
 
 import appdirs
-import six
 
 from reviewbot.config import config
 from reviewbot.utils.api import get_api_root
@@ -294,7 +293,7 @@ def init_repositories():
 
     for repository in config['repositories']:
         missing_keys = ({'name', 'type', 'clone_path'} -
-                        set(six.iterkeys(repository)))
+                        set(repository.keys()))
 
         if missing_keys:
             logger.error(
diff --git a/bot/reviewbot/testing/testcases.py b/bot/reviewbot/testing/testcases.py
index a6240c28f6731718b94acd5dfb8c0d3fecd22bc5..24334a00219c05e5895d3baf7e09a8ac3ec1e729 100644
--- a/bot/reviewbot/testing/testcases.py
+++ b/bot/reviewbot/testing/testcases.py
@@ -13,14 +13,12 @@ import unittest
 from contextlib import contextmanager
 from copy import deepcopy
 
-import six
 from rbtools.api.resource import (FileAttachmentListResource,
                                   FileDiffResource,
                                   ItemResource,
                                   ListResource,
                                   RootResource)
 from rbtools.api.tests.base import MockTransport
-from six.moves import range
 
 from reviewbot.config import config, reset_config
 from reviewbot.processing.review import File, Review
@@ -532,7 +530,7 @@ class TestCase(unittest.TestCase):
 
         # We'll attempt a very simple sort of merge, since at the time of this
         # implementation, we have a very simple default config schema.
-        for key, value in six.iteritems(new_config):
+        for key, value in new_config.items():
             if isinstance(value, dict):
                 config[key].update(value)
             else:
diff --git a/bot/reviewbot/tools/base/registry.py b/bot/reviewbot/tools/base/registry.py
index 6fb32bd16771c5b7ae37bf28382c2b74fd7254ae..b1f9c28efafcd76e04eaf16d80885768100a15cd 100644
--- a/bot/reviewbot/tools/base/registry.py
+++ b/bot/reviewbot/tools/base/registry.py
@@ -10,8 +10,6 @@ from __future__ import annotations
 
 import pkg_resources
 
-import six
-
 from reviewbot.utils.log import get_logger
 
 
@@ -99,7 +97,7 @@ def get_tool_classes():
         A list of tool classes (subclasses of
         :py:class:`reviewbot.tools.base.tool.BaseTool`).
     """
-    return sorted(six.itervalues(_registered_tools),
+    return sorted(_registered_tools.values(),
                   key=lambda tool_cls: tool_cls.tool_id)
 
 
diff --git a/bot/reviewbot/tools/flake8.py b/bot/reviewbot/tools/flake8.py
index d84c8530668e5ff6ae26f0b72d9d3398c312449c..1e225299e94519b264c9f880bd655a270f2c9df3 100644
--- a/bot/reviewbot/tools/flake8.py
+++ b/bot/reviewbot/tools/flake8.py
@@ -4,8 +4,6 @@ from __future__ import annotations
 
 import json
 
-import six
-
 from reviewbot.config import config
 from reviewbot.tools.base import BaseTool
 from reviewbot.tools.utils.codeclimate import \
@@ -106,7 +104,7 @@ class Flake8Tool(BaseTool):
             return
 
         assert len(payload) == 1
-        issues = next(six.itervalues(payload))
+        issues = next(iter(payload.values()))
 
         for issue in issues:
             add_comment_from_codeclimate_issue(issue_payload=issue,
diff --git a/bot/reviewbot/tools/gotool.py b/bot/reviewbot/tools/gotool.py
index b53844f5358d014e0a2848a2fce7759eb409e28c..1d80b8380794ce9a30e74bdfcfcd15f23817db82 100644
--- a/bot/reviewbot/tools/gotool.py
+++ b/bot/reviewbot/tools/gotool.py
@@ -7,8 +7,6 @@ import os
 import re
 from collections import OrderedDict
 
-import six
-
 from reviewbot.config import config
 from reviewbot.tools.base import BaseTool, FullRepositoryToolMixin
 from reviewbot.utils.process import execute
@@ -187,7 +185,7 @@ class GoTool(FullRepositoryToolMixin, BaseTool):
                         test_result['failed'] = True
 
         if test_results:
-            for test_name, test_result in six.iteritems(test_results):
+            for test_name, test_result in test_results.items():
                 if test_result['failed']:
                     review.general_comment(
                         '%s failed in the %s package:\n'
diff --git a/bot/reviewbot/tools/rbsecretscanner.py b/bot/reviewbot/tools/rbsecretscanner.py
index ddf25a7bfbe6b6722ac382339320d297d60887b7..dd01858d59aaab67d55e0b6b02b200465d556588 100644
--- a/bot/reviewbot/tools/rbsecretscanner.py
+++ b/bot/reviewbot/tools/rbsecretscanner.py
@@ -7,8 +7,6 @@ import json
 import re
 from zlib import crc32
 
-import six
-
 from reviewbot.tools.base import BaseTool
 from reviewbot.utils.text import base62_encode
 
@@ -299,7 +297,7 @@ class SecretScannerTool(BaseTool):
                 # check it now.
                 is_valid = True
 
-                for key, value in six.iteritems(m.groupdict()):
+                for key, value in m.groupdict().items():
                     if value is not None:
                         validate_func = getattr(self, '_is_%s_valid' % key,
                                                 None)
diff --git a/bot/reviewbot/tools/testing/testcases.py b/bot/reviewbot/tools/testing/testcases.py
index d3b81e8e1f1a655226339d7548a7e9fbfdf4146f..881821dace353ec07c8c7496abdd9b9295737375 100644
--- a/bot/reviewbot/tools/testing/testcases.py
+++ b/bot/reviewbot/tools/testing/testcases.py
@@ -12,7 +12,6 @@ from functools import wraps
 from unittest import SkipTest
 
 import kgb
-import six
 
 from reviewbot.config import config
 from reviewbot.repositories import GitRepository
@@ -61,7 +60,7 @@ class ToolTestCaseMetaclass(type):
                '%s must set tool_exe_config_key' % name
             assert d.get('tool_exe_path'), '%s must set tool_exe_path' % name
 
-        for func_name, func in six.iteritems(d.copy()):
+        for func_name, func in d.copy().items():
             if callable(func):
                 added = False
 
@@ -375,7 +374,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
         if other_files:
             review_files[filename] = review_file
 
-            for other_filename, other_contents in six.iteritems(other_files):
+            for other_filename, other_contents in other_files.items():
                 assert isinstance(other_contents, bytes)
 
                 review_files[other_filename] = self.create_review_file(
diff --git a/bot/reviewbot/tools/tests/test_cargotool.py b/bot/reviewbot/tools/tests/test_cargotool.py
index dfe135a82089c3a77951dd17b95f21576b56fed3..10af02e436e14eee7a468ef1e7d550fa5ce612ca 100644
--- a/bot/reviewbot/tools/tests/test_cargotool.py
+++ b/bot/reviewbot/tools/tests/test_cargotool.py
@@ -7,7 +7,6 @@ import os
 import tempfile
 
 import kgb
-import six
 
 from reviewbot.tools.cargotool import CargoTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -17,8 +16,7 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class CargoToolTests(BaseToolTestCase):
+class CargoToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.cargotool.CargoTool."""
 
     tool_class = CargoTool
diff --git a/bot/reviewbot/tools/tests/test_checkstyle.py b/bot/reviewbot/tools/tests/test_checkstyle.py
index 50316f9975debe0f0bc806e73291ade8432ca97f..19e5da692aebcb68b220c77a24624991cdccb476 100644
--- a/bot/reviewbot/tools/tests/test_checkstyle.py
+++ b/bot/reviewbot/tools/tests/test_checkstyle.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.config import config
 from reviewbot.testing import get_test_dep_path
@@ -18,8 +17,7 @@ from reviewbot.utils.filesystem import tmpdirs, tmpfiles
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class CheckstyleToolTests(BaseToolTestCase):
+class CheckstyleToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.checkstyle.CheckstyleTool."""
 
     tool_class = CheckstyleTool
diff --git a/bot/reviewbot/tools/tests/test_clang.py b/bot/reviewbot/tools/tests/test_clang.py
index 7c9457cbe674e386544136ed86af0506a9d1220c..5886ddef0df5961012161de81a8e62d02b7b1ce9 100644
--- a/bot/reviewbot/tools/tests/test_clang.py
+++ b/bot/reviewbot/tools/tests/test_clang.py
@@ -5,8 +5,6 @@ from __future__ import annotations
 import os
 import plistlib
 
-import six
-
 from reviewbot.tools.clang import ClangTool
 from reviewbot.tools.testing import (BaseToolTestCase,
                                      ToolTestCaseMetaclass,
@@ -16,8 +14,7 @@ from reviewbot.utils.filesystem import tmpfiles
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class ClangToolTests(BaseToolTestCase):
+class ClangToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.clang.ClangTool."""
 
     tool_class = ClangTool
diff --git a/bot/reviewbot/tools/tests/test_cppcheck.py b/bot/reviewbot/tools/tests/test_cppcheck.py
index 0cef19e94d4f804fe23ccb4540143284927e0c59..66dc6486a303ab026078d7f5e1686dd22e19ee66 100644
--- a/bot/reviewbot/tools/tests/test_cppcheck.py
+++ b/bot/reviewbot/tools/tests/test_cppcheck.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.cppcheck import CPPCheckTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class CPPCheckToolTests(BaseToolTestCase):
+class CPPCheckToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.cppcheck.CPPCheckTool."""
 
     tool_class = CPPCheckTool
diff --git a/bot/reviewbot/tools/tests/test_cpplint.py b/bot/reviewbot/tools/tests/test_cpplint.py
index 85d353277faa4844b72c890515480cbbe3011b65..949bfe6e94123cc19c6f9fcbb9339fa4ccf434f6 100644
--- a/bot/reviewbot/tools/tests/test_cpplint.py
+++ b/bot/reviewbot/tools/tests/test_cpplint.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.cpplint import CPPLintTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class CPPLintToolTests(BaseToolTestCase):
+class CPPLintToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.cpplint.CPPLintTool."""
 
     tool_class = CPPLintTool
diff --git a/bot/reviewbot/tools/tests/test_doc8.py b/bot/reviewbot/tools/tests/test_doc8.py
index ff0bc2572fc69540b5e98d87efab8ac9a43ee85f..c2717a98e4f13e2f0c7f60ee2b67d2561d268844 100644
--- a/bot/reviewbot/tools/tests/test_doc8.py
+++ b/bot/reviewbot/tools/tests/test_doc8.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.doc8 import Doc8Tool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class Doc8ToolTests(BaseToolTestCase):
+class Doc8ToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.doc8.Doc8Tool."""
 
     tool_class = Doc8Tool
diff --git a/bot/reviewbot/tools/tests/test_fbinfer.py b/bot/reviewbot/tools/tests/test_fbinfer.py
index 58be00d40f17ee39e67950c30866cd5434cfdedb..a826e4be24575328db0838f37fb6d79f743d1643 100644
--- a/bot/reviewbot/tools/tests/test_fbinfer.py
+++ b/bot/reviewbot/tools/tests/test_fbinfer.py
@@ -7,8 +7,6 @@ import os
 import tempfile
 from unittest import SkipTest
 
-import six
-
 from reviewbot.config import config
 from reviewbot.tools.fbinfer import FBInferTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -18,8 +16,7 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute, is_exe_in_path
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class FBInferToolTests(BaseToolTestCase):
+class FBInferToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.fbinfer.FBInferTool."""
 
     tool_class = FBInferTool
diff --git a/bot/reviewbot/tools/tests/test_flake8.py b/bot/reviewbot/tools/tests/test_flake8.py
index 29d392e8b796e02ff07ecf99efb0f0d4b85d9a60..1f67d3740952b31832bcbf182ea475764cd6ea0d 100644
--- a/bot/reviewbot/tools/tests/test_flake8.py
+++ b/bot/reviewbot/tools/tests/test_flake8.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import json
 
 import kgb
-import six
 
 from reviewbot.tools.flake8 import Flake8Tool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -15,8 +14,7 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class Flake8ToolTests(BaseToolTestCase):
+class Flake8ToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.flake8.Flake8Tool."""
 
     tool_class = Flake8Tool
diff --git a/bot/reviewbot/tools/tests/test_gofmt.py b/bot/reviewbot/tools/tests/test_gofmt.py
index 394681b398f5f61de69fca16662e5b0ac3e5a72f..361ef2a6ba403af9c84b6f6c59ac35ac903b1c05 100644
--- a/bot/reviewbot/tools/tests/test_gofmt.py
+++ b/bot/reviewbot/tools/tests/test_gofmt.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.gofmt import GofmtTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class GofmtToolTests(BaseToolTestCase):
+class GofmtToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.gofmt.GofmtTool."""
 
     tool_class = GofmtTool
diff --git a/bot/reviewbot/tools/tests/test_gotool.py b/bot/reviewbot/tools/tests/test_gotool.py
index f5a0582ed082a7d2147c409c918eecb8d4309a99..71e86266b7a878972b4874b1d21a36440c330d67 100644
--- a/bot/reviewbot/tools/tests/test_gotool.py
+++ b/bot/reviewbot/tools/tests/test_gotool.py
@@ -6,8 +6,6 @@ import os
 import shutil
 import tempfile
 
-import six
-
 from reviewbot.tools.gotool import GoTool
 from reviewbot.tools.testing import (BaseToolTestCase,
                                      ToolTestCaseMetaclass,
@@ -16,8 +14,7 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class GoToolTests(BaseToolTestCase):
+class GoToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.gotool.GoTool."""
 
     tool_class = GoTool
diff --git a/bot/reviewbot/tools/tests/test_jshint.py b/bot/reviewbot/tools/tests/test_jshint.py
index f90e519c69fbdf2d8f6d2604531794d7572b2932..0c508d196e21209331cf1a89d4b171c642a73f63 100644
--- a/bot/reviewbot/tools/tests/test_jshint.py
+++ b/bot/reviewbot/tools/tests/test_jshint.py
@@ -6,7 +6,6 @@ import json
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.jshint import JSHintTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -17,8 +16,7 @@ from reviewbot.utils.filesystem import tmpdirs, tmpfiles
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class JSHintToolTests(BaseToolTestCase):
+class JSHintToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.jshint.JSHintTool."""
 
     tool_class = JSHintTool
diff --git a/bot/reviewbot/tools/tests/test_pmd.py b/bot/reviewbot/tools/tests/test_pmd.py
index 3376464944e5ca4e566eadc9e86d6196b090d957..58f11c0a0b94b0c802decbc24acec62a2f465ece 100644
--- a/bot/reviewbot/tools/tests/test_pmd.py
+++ b/bot/reviewbot/tools/tests/test_pmd.py
@@ -6,7 +6,6 @@ import json
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.pmd import PMDTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -18,8 +17,7 @@ from reviewbot.utils.filesystem import tmpdirs, tmpfiles
 from reviewbot.utils.process import execute, is_exe_in_path
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class PMDToolTests(BaseToolTestCase):
+class PMDToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.pmd.PMDTool."""
 
     tool_class = PMDTool
@@ -580,7 +578,7 @@ class PMDToolTests(BaseToolTestCase):
             stderr (unicode, optional):
                 The error output to simulate from PMD.
         """
-        assert isinstance(stderr, six.text_type)
+        assert isinstance(stderr, str)
 
         @self.spy_for(execute)
         def _execute(cmdline, *args, **kwargs):
diff --git a/bot/reviewbot/tools/tests/test_pycodestyle.py b/bot/reviewbot/tools/tests/test_pycodestyle.py
index 62a944b04cce38e619579acdd39d12686c880d67..dc96e34780ee428da90addc1b8f930da166b71e8 100644
--- a/bot/reviewbot/tools/tests/test_pycodestyle.py
+++ b/bot/reviewbot/tools/tests/test_pycodestyle.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.pycodestyle import PycodestyleTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,8 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class BasePycodestyleToolTests(BaseToolTestCase):
+class BasePycodestyleToolTests(BaseToolTestCase,
+                               metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.pycodestyle.PycodestyleTool."""
 
     tool_class = PycodestyleTool
diff --git a/bot/reviewbot/tools/tests/test_pydocstyle.py b/bot/reviewbot/tools/tests/test_pydocstyle.py
index 7ef4c528aadbc29063b9920ad64f1a977bbe93b0..3e13b513481fdb0b31bded206df2cbd8a89b93e1 100644
--- a/bot/reviewbot/tools/tests/test_pydocstyle.py
+++ b/bot/reviewbot/tools/tests/test_pydocstyle.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.pydocstyle import PydocstyleTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class PydocstyleToolTests(BaseToolTestCase):
+class PydocstyleToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.pydocstyle.PydocstyleTool."""
 
     tool_class = PydocstyleTool
diff --git a/bot/reviewbot/tools/tests/test_pyflakes.py b/bot/reviewbot/tools/tests/test_pyflakes.py
index ca00e3b483d05aea8cf901b0e2c10c49d63f9948..537c5666fb7dbaaa26e45060f290f44eaae29755 100644
--- a/bot/reviewbot/tools/tests/test_pyflakes.py
+++ b/bot/reviewbot/tools/tests/test_pyflakes.py
@@ -3,7 +3,6 @@
 from __future__ import annotations
 
 import kgb
-import six
 
 from reviewbot.tools.pyflakes import PyflakesTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -13,8 +12,7 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class PyflakesToolTests(BaseToolTestCase):
+class PyflakesToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.pyflakes.PyflakesTool."""
 
     tool_class = PyflakesTool
diff --git a/bot/reviewbot/tools/tests/test_rbsecretscanner.py b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
index c6ac6fa49542b688380a594c3623ce9bc0726f75..1887cd59799dcc6500435f41de32a036f68c5ea4 100644
--- a/bot/reviewbot/tools/tests/test_rbsecretscanner.py
+++ b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
@@ -2,9 +2,6 @@
 
 from __future__ import annotations
 
-import kgb
-import six
-
 from reviewbot.tools.rbsecretscanner import SecretScannerTool
 from reviewbot.tools.testing import (BaseToolTestCase,
                                      ToolTestCaseMetaclass,
@@ -12,8 +9,8 @@ from reviewbot.tools.testing import (BaseToolTestCase,
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class SecretScannerToolTests(BaseToolTestCase, kgb.SpyAgency):
+class SecretScannerToolTests(BaseToolTestCase,
+                             metaclass=ToolTestCaseMetaclass):
     """Unit tests for SecretScannerTool."""
 
     tool_class = SecretScannerTool
diff --git a/bot/reviewbot/tools/tests/test_rubocop.py b/bot/reviewbot/tools/tests/test_rubocop.py
index 15730dac476f1f0445fb720cd189f90ed96e4596..882bd70ffc0d5216330568cf9ca917738d0763df 100644
--- a/bot/reviewbot/tools/tests/test_rubocop.py
+++ b/bot/reviewbot/tools/tests/test_rubocop.py
@@ -7,7 +7,6 @@ import os
 import re
 
 import kgb
-import six
 
 from reviewbot.tools.rubocop import RubocopTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -18,8 +17,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class RubocopToolTests(BaseToolTestCase):
+class RubocopToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.rubocop.RubocopTool."""
 
     tool_class = RubocopTool
diff --git a/bot/reviewbot/tools/tests/test_rustfmt.py b/bot/reviewbot/tools/tests/test_rustfmt.py
index b0bc79d5e36b1d9a003d8c6be5d40a3bf347f02a..5fb6c07ac72dd6958dd0a5b5e2ccb1694798bb2a 100644
--- a/bot/reviewbot/tools/tests/test_rustfmt.py
+++ b/bot/reviewbot/tools/tests/test_rustfmt.py
@@ -5,7 +5,6 @@ from __future__ import annotations
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.rustfmt import RustfmtTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -16,8 +15,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class RustfmtToolTests(BaseToolTestCase):
+class RustfmtToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.rustfmt.RustfmtTool."""
 
     tool_class = RustfmtTool
diff --git a/bot/reviewbot/tools/tests/test_shellcheck.py b/bot/reviewbot/tools/tests/test_shellcheck.py
index ffe749cb407491f887c4c55e1cf7979cd1f22566..581918b3dc1cbc9e62c78dcfe59f2b2614c37cda 100644
--- a/bot/reviewbot/tools/tests/test_shellcheck.py
+++ b/bot/reviewbot/tools/tests/test_shellcheck.py
@@ -6,7 +6,6 @@ import json
 import os
 
 import kgb
-import six
 
 from reviewbot.tools.shellcheck import ShellCheckTool
 from reviewbot.tools.testing import (BaseToolTestCase,
@@ -17,8 +16,7 @@ from reviewbot.utils.filesystem import tmpdirs
 from reviewbot.utils.process import execute
 
 
-@six.add_metaclass(ToolTestCaseMetaclass)
-class ShellCheckToolTests(BaseToolTestCase):
+class ShellCheckToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
     """Unit tests for reviewbot.tools.shellcheck.ShellCheckTool."""
 
     tool_class = ShellCheckTool
