diff --git a/bot/reviewbot/__init__.py b/bot/reviewbot/__init__.py
index c77917a789e6b6c9bb6d2bded2e139a9b3b5c0ac..779e50d905aed7a40a66e8d3723037d746df2eea 100644
--- a/bot/reviewbot/__init__.py
+++ b/bot/reviewbot/__init__.py
@@ -11,7 +11,7 @@ def get_version_string():
     """Return the version of Review Bot.
 
     Returns:
-        unicode:
+        str:
         The full version.
     """
     version = '%s.%s' % (VERSION[0], VERSION[1])
@@ -42,7 +42,7 @@ def get_package_version():
     This is a simplified version string which is used when building a package.
 
     Returns:
-        unicode:
+        str:
         The version to use for the package.
     """
     version = '%d.%d' % (VERSION[0], VERSION[1])
diff --git a/bot/reviewbot/celery.py b/bot/reviewbot/celery.py
index 63bf46bfee635a09fc83aba2f785fbd0047877b6..038b6f5da8af65ee4efbadd599d2e64437b2fedb 100644
--- a/bot/reviewbot/celery.py
+++ b/bot/reviewbot/celery.py
@@ -360,42 +360,42 @@ def start_worker(broker, hostname, loglevel, logfile, detach, pidfile, uid,
         3.0
 
     Args:
-        broker (unicode):
+        broker (str):
             The broker URI.
 
-        hostname (unicode):
+        hostname (str):
             The local hostname Review Bot will identify with when talking to
             the broker.
 
-        loglevel (unicode):
+        loglevel (str):
             The minimum log level.
 
-        logfile (unicode):
+        logfile (str):
             The path to a log file to write to.
 
         detach (bool):
             Whether to run the worker in a detached process.
 
-        pidfile (unicode):
+        pidfile (str):
             The path to a PID file to write to when detaching.
 
-        uid (unicode):
+        uid (str):
             The user ID to use when detaching.
 
-        gid (unicode):
+        gid (str):
             The group ID to use when detaching.
 
-        umask (unicode):
+        umask (str):
             The umask (in octal string format) to use for the process when
             detaching.
 
         concurrency (int):
             The number of concurrent processes to run.
 
-        pool_cls (unicode):
+        pool_cls (str):
             The pool implementation.
 
-        autoscale (unicode):
+        autoscale (str):
             The autoscale settings, in the form of
             ``max_concurrency,min_concurrency``.
 
diff --git a/bot/reviewbot/config.py b/bot/reviewbot/config.py
index 3342ff6871e14551a00cdbe72f15ee6f62a41c45..eeab5fefe810de3221a2ccee1735f82c0f12462a 100644
--- a/bot/reviewbot/config.py
+++ b/bot/reviewbot/config.py
@@ -54,7 +54,7 @@ def _load_json_config_items(path):
         3.0
 
     Args:
-        path (unicode):
+        path (str):
             The path to the file.
 
     Returns:
@@ -85,7 +85,7 @@ def get_config_file_path():
         3.0
 
     Returns:
-        unicode:
+        str:
         The configuration file path.
     """
     return os.environ.get(
diff --git a/bot/reviewbot/deprecation.py b/bot/reviewbot/deprecation.py
index 7c1f1cb84fd36c8b27eb66cd46bdd32cd0b3cc0f..076efbe1a90eadfa6721952e6e848fe6c57edf71 100644
--- a/bot/reviewbot/deprecation.py
+++ b/bot/reviewbot/deprecation.py
@@ -30,7 +30,7 @@ class BaseRemovedInReviewBotVersionWarning(DeprecationWarning):
         a useful message and a custom stack level.
 
         Args:
-            message (unicode):
+            message (str):
                 The message to show in the deprecation warning.
 
             stacklevel (int, optional):
diff --git a/bot/reviewbot/errors.py b/bot/reviewbot/errors.py
index 7cf6840aca865bd0c5ee4608f13b44777f9bc824..4e58fa41c3bb599b00ac9294059f473e53ca3820 100644
--- a/bot/reviewbot/errors.py
+++ b/bot/reviewbot/errors.py
@@ -21,7 +21,7 @@ class SuspiciousFilePath(Exception):
         """Initialize the exception.
 
         Args:
-            path (unicode):
+            path (str):
                 The path that was suspicious.
         """
         self.path = path
diff --git a/bot/reviewbot/processing/review.py b/bot/reviewbot/processing/review.py
index 46e73e2904a8d7401c7b6d34e1ee4639eec017b2..3766d4f3862945a81f1b39cf431b07c309aa5150 100644
--- a/bot/reviewbot/processing/review.py
+++ b/bot/reviewbot/processing/review.py
@@ -177,7 +177,7 @@ class File(object):
             Empty files no longer return ``None``.
 
         Returns:
-            unicode:
+            str:
             The filename of a new temporary file containing the patched file
             contents. If the file is deleted, this will return ``None``.
         """
@@ -209,7 +209,7 @@ class File(object):
             Empty files no longer return ``None``.
 
         Returns:
-            unicode:
+            str:
             The filename of a new temporary file containing the original file
             contents. If the file is new, this will return ``None``.
         """
@@ -249,7 +249,7 @@ class File(object):
                 Whether to return lines from the original (unmodified) file.
 
         Returns:
-            list of unicode:
+            list of str:
             The list of lines, up to the maximum requested. This will be
             empty if the lines could not be found.
         """
@@ -280,7 +280,7 @@ class File(object):
             3.0
 
         Args:
-            root_target_dir (unicode):
+            root_target_dir (str):
                 The root directory for the project. No files are allowed to
                 be created, modified, deleted, or linked to outside of this
                 path.
@@ -336,7 +336,7 @@ class File(object):
             ``text_extra`` arguments.
 
         Args:
-            text (unicode):
+            text (str):
                 The text of the comment.
 
             first_line (int):
@@ -351,7 +351,7 @@ class File(object):
                 applied, as reported by a linter. If provided, this will be
                 appended to the text.
 
-            error_code (unicode, optional):
+            error_code (str, optional):
                 An error code for the error being reported. If provided,
                 this will be appended to the text.
 
@@ -365,7 +365,7 @@ class File(object):
                 If True, the ``first_line`` argument corresponds to the line
                 number in the original file, instead of the patched file.
 
-            severity (unicode, optional):
+            severity (str, optional):
                 A tool-specific, human-readable indication of the severity of
                 this comment.
 
@@ -689,7 +689,7 @@ class Review(object):
         """Make a general comment.
 
         Args:
-            text (unicode):
+            text (str):
                 The text of the comment.
 
             issue (bool, optional):
@@ -748,7 +748,7 @@ class Review(object):
         """The contents of the patch.
 
         Returns:
-            unicode:
+            str:
             The contents of the patch associated with the review request and
             diff revision.
         """
@@ -766,7 +766,7 @@ class Review(object):
         """Fetch the patch and return the filename of it.
 
         Returns:
-            unicode:
+            str:
             The filename of a new temporary file containing the patch contents.
             If the patch is empty, return None.
         """
diff --git a/bot/reviewbot/repositories.py b/bot/reviewbot/repositories.py
index 371e2edb71ce7df2650cd49805bdbd1ab8958ece..ea5f4b936397940aeeb0dd4facb4ba3eb3c3af7d 100644
--- a/bot/reviewbot/repositories.py
+++ b/bot/reviewbot/repositories.py
@@ -25,14 +25,14 @@ class BaseRepository(object):
     """A repository.
 
     Attributes:
-        clone_path (unicode):
+        clone_path (str):
             The clone path of the repository. This may be the ``path`` or
             ``mirror_path`` of the repository in the API.
 
-        name (unicode):
+        name (str):
             The name of the repository.
 
-        repo_path (unicode):
+        repo_path (str):
             The local path where the clone/checkout is or will be stored.
     """
 
@@ -42,7 +42,7 @@ class BaseRepository(object):
     #:     3.0
     #:
     #: Type:
-    #:     tuple of unicode
+    #:     tuple of str
     repo_types = None
 
     #: The Review Board tool name that this supports.
@@ -51,20 +51,20 @@ class BaseRepository(object):
     #:     3.0
     #:
     #: Type:
-    #:     unicode
+    #:     str
     tool_name = None
 
     def __init__(self, name, clone_path):
         """Initialize the repository.
 
         Args:
-            name (unicode):
+            name (str):
                 The name of the repository.
 
-            clone_path (unicode):
+            clone_path (str):
                 The clone path of the repository.
 
-            repo_path (unicode):
+            repo_path (str):
         """
         self.name = name
         self.clone_path = clone_path
@@ -80,11 +80,11 @@ class BaseRepository(object):
         """Check out the given commit.
 
         Args:
-            commit_id (unicode):
+            commit_id (str):
                 The ID of the commit to check out.
 
         Returns:
-            unicode:
+            str:
             The name of a directory with the given checkout.
         """
         raise NotImplementedError
@@ -112,7 +112,7 @@ class BaseRepository(object):
             3.0
 
         Returns:
-            unicode:
+            str:
             A string representation.
         """
         return '<%s(name=%r, clone_path=%r, repo_path=%r)>' % (
@@ -144,11 +144,11 @@ class GitRepository(BaseRepository):
         """Check out the given commit.
 
         Args:
-            commit_id (unicode):
+            commit_id (str):
                 The ID of the commit to check out.
 
         Returns:
-            unicode:
+            str:
             The name of a directory with the given checkout.
         """
         workdir = make_tempdir()
@@ -197,11 +197,11 @@ class HgRepository(BaseRepository):
         """Check out the given commit.
 
         Args:
-            commit_id (unicode):
+            commit_id (str):
                 The ID of the commit to check out.
 
         Returns:
-            unicode:
+            str:
             The name of a directory with the given checkout.
         """
         workdir = make_tempdir()
@@ -218,13 +218,13 @@ def fetch_repositories(url, user=None, token=None):
     """Fetch repositories from Review Board.
 
     Args:
-        url (unicode):
+        url (str):
             The configured url for the connection.
 
-        user (unicode):
+        user (str):
             The configured user for the connection.
 
-        token (unicode):
+        token (str):
             The configured API token for the user.
     """
     logger.info('Fetching repositories from Review Board: %s', url)
diff --git a/bot/reviewbot/tasks.py b/bot/reviewbot/tasks.py
index 3bd4e1b0fb6b5326c5faecd4f29369f1b36863dc..ddde621bea914f3b49e813904d3b3f4d0079e1c9 100644
--- a/bot/reviewbot/tasks.py
+++ b/bot/reviewbot/tasks.py
@@ -41,13 +41,13 @@ def RunTool(server_url='',
     """Execute an automated review on a review request.
 
     Args:
-        server_url (unicode):
+        server_url (str):
             The URL of the Review Board server.
 
-        session (unicode):
+        session (str):
             The encoded session identifier.
 
-        username (unicode):
+        username (str):
             The name of the user who owns the ``session``.
 
         review_request_id (int):
@@ -66,11 +66,11 @@ def RunTool(server_url='',
         tool_options (dict):
             The tool-specific settings.
 
-        repository_name (unicode):
+        repository_name (str):
             The name of the repository to clone to run the tool, if the tool
             requires full working directory access.
 
-        base_commit_id (unicode):
+        base_commit_id (str):
             The ID of the commit that the patch should be applied to.
 
         *args (tuple):
diff --git a/bot/reviewbot/testing/testcases.py b/bot/reviewbot/testing/testcases.py
index 24334a00219c05e5895d3baf7e09a8ac3ec1e729..c336e2bb5fe19c920439dc819e515490ec51f227 100644
--- a/bot/reviewbot/testing/testcases.py
+++ b/bot/reviewbot/testing/testcases.py
@@ -325,7 +325,7 @@ class DummyRootResource(RootResource):
         This only supports the Review Bot extension ID.
 
         Args:
-            extension_name (unicode):
+            extension_name (str):
                 The extension name requested.
 
             **kwargs (dict):
@@ -410,7 +410,7 @@ class DummyRootResource(RootResource):
         """Return a user file attachment list resource.
 
         Args:
-            username (unicode):
+            username (str):
                 The username for the user who owns the file attachments.
 
             **kwargs (dict, unused):
@@ -498,7 +498,7 @@ class TestCase(unittest.TestCase):
         short, though.
 
         Returns:
-            unicode:
+            str:
             The test description, without truncating lines.
         """
         doc = self._testMethodDoc
@@ -589,16 +589,16 @@ class TestCase(unittest.TestCase):
             filediff_id (int, optional):
                 The ID of the FileDiff being reviewed.
 
-            source_file (unicode, optional):
+            source_file (str, optional):
                 The filename of the original version of the file.
 
-            dest_file (unicode, optional):
+            dest_file (str, optional):
                 The filename of the modified version of the file.
 
-            source_revision (unicode, optional):
+            source_revision (str, optional):
                 The source revision for the file.
 
-            status (unicode, optional):
+            status (str, optional):
                 The status value set for the FileDiff.
 
             patch (bytes, optional):
@@ -612,7 +612,7 @@ class TestCase(unittest.TestCase):
                 The patched version of the file. If not provided, one will
                 be generated.
 
-            patched_file_path (unicode, optional):
+            patched_file_path (str, optional):
                 The local path to the patched file content.
 
             diff_data (dict, optional):
@@ -845,16 +845,16 @@ class TestCase(unittest.TestCase):
             review_request_id (int, optional):
                 The ID of the review request that owns the FileDiff.
 
-            source_file (unicode, optional):
+            source_file (str, optional):
                 The filename of the original version of the file.
 
-            source_revision (unicode, optional):
+            source_revision (str, optional):
                 The source revision for the file.
 
-            dest_file (unicode, optional):
+            dest_file (str, optional):
                 The filename of the modified version of the file.
 
-            status (unicode, optional):
+            status (str, optional):
                 The status value set for the FileDiff.
 
             binary (bool, optional):
diff --git a/bot/reviewbot/testing/utils.py b/bot/reviewbot/testing/utils.py
index 6427a1df791f5c873fa5133b2c1fa792d3420687..38944372bb4836e8f36dad00cd7eaa6738d75058 100644
--- a/bot/reviewbot/testing/utils.py
+++ b/bot/reviewbot/testing/utils.py
@@ -21,11 +21,11 @@ def get_test_dep_path(filename):
         3.0
 
     Args:
-        filename (unicode):
+        filename (str):
             The name of the file relative to the directory.
 
     Returns:
-        unicode:
+        str:
         The path to the dependency file.
     """
     return os.path.abspath(os.path.join(reviewbot.__file__, '..', '..',
diff --git a/bot/reviewbot/tests/test_config.py b/bot/reviewbot/tests/test_config.py
index 143146c9ea0b7bb6c7ddbfcfd1d5adfde79b5a29..3441b55eecce310ba0d6286d842008ac4f91bc04 100644
--- a/bot/reviewbot/tests/test_config.py
+++ b/bot/reviewbot/tests/test_config.py
@@ -699,11 +699,11 @@ class ConfigTests(kgb.SpyAgency, TestCase):
         default-loaded configuration file.
 
         Args:
-            config_contents (unicode):
+            config_contents (str):
                 The configuration file contents.
 
         Returns:
-            unicode:
+            str:
             The path to the configuration file.
         """
         tempdir = tempfile.mkdtemp()
diff --git a/bot/reviewbot/tests/test_tasks.py b/bot/reviewbot/tests/test_tasks.py
index b897c2af708a72db291ff5177773ea7fba1aff96..3285f2ac10e8e8d4e2e1316b11d3afead9ac4fc2 100644
--- a/bot/reviewbot/tests/test_tasks.py
+++ b/bot/reviewbot/tests/test_tasks.py
@@ -420,7 +420,7 @@ class RunToolTests(BaseTaskTestCase):
         performed.
 
         Args:
-            routing_key (unicode):
+            routing_key (str):
                 The routing key to pass for the task.
 
             **kwargs (dict):
diff --git a/bot/reviewbot/tools/base/mixins.py b/bot/reviewbot/tools/base/mixins.py
index 2ebecac2a8283476c6c34c57edc440d6dcb8cf90..adeca07d566786d82b4e987539f006ab9520aea1 100644
--- a/bot/reviewbot/tools/base/mixins.py
+++ b/bot/reviewbot/tools/base/mixins.py
@@ -46,13 +46,13 @@ class FilePatternsFromSettingMixin(object):
     #: The name of a tool setting for a comma-separated list of extensions.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     file_extensions_setting = None
 
     #: The name of a tool setting for a comma-separated list of patterns.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     file_patterns_setting = None
 
     #: Whether to include default file patterns in the resulting list.
@@ -124,7 +124,7 @@ class FullRepositoryToolMixin(object):
             repository (reviewbot.repositories.Repository, optional):
                 The repository.
 
-            base_commit_id (unicode, optional):
+            base_commit_id (str, optional):
                 The ID of the commit that the patch should be applied to.
         """
         repository.sync()
@@ -150,13 +150,13 @@ class JavaToolMixin(object):
     #: Main class to call to run the Java application.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     java_main = None
 
     #: The key identifying the classpaths to use.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     java_classpaths_key = None
 
     exe_dependencies = ['java']
@@ -239,7 +239,7 @@ class JavaToolMixin(object):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return self._build_java_command(**kwargs)
@@ -251,7 +251,7 @@ class JavaToolMixin(object):
         :py:attr:`java_main`.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line for running the Java class.
         """
         classpath = ':'.join(
@@ -270,7 +270,7 @@ class JavaToolMixin(object):
         """Return whether all entries in a classpath exist.
 
         Args:
-            classpath (list of unicode):
+            classpath (list of str):
                 The classpath locations.
 
         Returns:
diff --git a/bot/reviewbot/tools/base/registry.py b/bot/reviewbot/tools/base/registry.py
index b1f9c28efafcd76e04eaf16d80885768100a15cd..c2fbbb7a1ab76e05612414ca46187e2a01124dd5 100644
--- a/bot/reviewbot/tools/base/registry.py
+++ b/bot/reviewbot/tools/base/registry.py
@@ -77,7 +77,7 @@ def get_tool_class(tool_id):
     """Return the tool class with a given ID.
 
     Args:
-        tool_id (unicode):
+        tool_id (str):
             The ID of the tool to return.
 
     Returns:
diff --git a/bot/reviewbot/tools/base/tool.py b/bot/reviewbot/tools/base/tool.py
index c5fb5e2796bd681d4eabdaf320e722e9e9aec47d..fd1eae941305884c85682dd2fffc3f00071fa3d1 100644
--- a/bot/reviewbot/tools/base/tool.py
+++ b/bot/reviewbot/tools/base/tool.py
@@ -30,13 +30,13 @@ class BaseTool(object):
     #: The displayed name of the tool.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     name = ''
 
     #: A short description of the tool.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     description = ''
 
     #: The compatibility version of the tool.
@@ -49,7 +49,7 @@ class BaseTool(object):
     #: the older tool.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     version = '1'
 
     #: A list of executable tools required by the tool.
@@ -85,7 +85,7 @@ class BaseTool(object):
     #:     3.0
     #:
     #: Type:
-    #:     list of unicode
+    #:     list of str
     file_patterns = []
 
     #: Configurable options defined for the tool.
@@ -93,10 +93,10 @@ class BaseTool(object):
     #: Each item in the list is a dictionary representing a form field to
     #: display in the Review Board administration UI. Keys include:
     #:
-    #: ``field_type`` (:py:class:`unicode`):
+    #: ``field_type`` (:py:class:`str`):
     #:     The full path as a string to a Django form field class to render.
     #:
-    #: ``name`` (:py:class:`unicode`):
+    #: ``name`` (:py:class:`str`):
     #:     The name/ID of the field. This will map to the key in the
     #:     settings provided to :py:meth:`handle_files` and
     #:     :py:meth:`handle_file`.
@@ -111,7 +111,7 @@ class BaseTool(object):
     #:     Information on the Django form field widget class used to render
     #:     the field. This dictionary includes the following keys:
     #:
-    #:     ``type`` (:py:class:`unicode`):
+    #:     ``type`` (:py:class:`str`):
     #:         The full path as a string to a Django form field widget class.
     #:
     #:     ``attrs`` (:py:class:`dict`, optional):
@@ -259,7 +259,7 @@ class BaseTool(object):
             repository (reviewbot.repositories.Repository, optional):
                 The repository.
 
-            base_commit_id (unicode, optional):
+            base_commit_id (str, optional):
                 The ID of the commit that the patch should be applied to.
 
             **kwargs (dict, unused):
@@ -288,7 +288,7 @@ class BaseTool(object):
                 Additional keyword arguments, for future expansion.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return []
@@ -354,12 +354,12 @@ class BaseTool(object):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode, optional):
+            path (str, optional):
                 The local path to the patched file to review.
 
                 This won't be passed for legacy tools.
 
-            base_command (list of unicode, optional):
+            base_command (list of str, optional):
                 The common base command line used for reviewing a file,
                 if returned from :py:meth:`build_base_command`.
 
diff --git a/bot/reviewbot/tools/cargotool.py b/bot/reviewbot/tools/cargotool.py
index c6efc9a2e4f3052bc83f377c670f9a5429366531..bfa828c50b19bed6dc3a1d53f19a84d08ae56431 100644
--- a/bot/reviewbot/tools/cargotool.py
+++ b/bot/reviewbot/tools/cargotool.py
@@ -68,7 +68,7 @@ class CargoTool(FullRepositoryToolMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return [config['exe_paths']['cargo']]
@@ -83,7 +83,7 @@ class CargoTool(FullRepositoryToolMixin, BaseTool):
             review (reviewbot.processing.review.Review):
                 The review being populated.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run cargo.
 
             **kwargs (dict, unused):
@@ -115,7 +115,7 @@ class CargoTool(FullRepositoryToolMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
             file_results (dict):
@@ -182,7 +182,7 @@ class CargoTool(FullRepositoryToolMixin, BaseTool):
         :py:meth:`handle_file`.
 
         Args:
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run cargo.
 
         Returns:
@@ -237,7 +237,7 @@ class CargoTool(FullRepositoryToolMixin, BaseTool):
         :py:attr:`TEST_LINES_LIMIT` lines of unit test output.
 
         Args:
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run cargo.
         """
         output = execute(
diff --git a/bot/reviewbot/tools/checkstyle.py b/bot/reviewbot/tools/checkstyle.py
index 9810e4b6e6ebecd2cbc21656cd29b9fefc12d726..fa489dada2eae06331f9a9317bf6590c8e0ce3ce 100644
--- a/bot/reviewbot/tools/checkstyle.py
+++ b/bot/reviewbot/tools/checkstyle.py
@@ -54,7 +54,7 @@ class CheckstyleTool(JavaToolMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         config_xml = self.settings['config'].strip()
@@ -75,10 +75,10 @@ class CheckstyleTool(JavaToolMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run checkstyle.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/clang.py b/bot/reviewbot/tools/clang.py
index 9ff895c4f16f4b57a73abac8089824bb84f4e579..8295818916998c644a48d91dc6d20e4815155762 100644
--- a/bot/reviewbot/tools/clang.py
+++ b/bot/reviewbot/tools/clang.py
@@ -52,7 +52,7 @@ class ClangTool(FullRepositoryToolMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -78,10 +78,10 @@ class ClangTool(FullRepositoryToolMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run clang.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/cppcheck.py b/bot/reviewbot/tools/cppcheck.py
index 0faadfcacf80b3bad7ed95fad144614b1f6c37fa..6be9ff29fed9ef6e7ded1ac7d0cef6290873d550 100644
--- a/bot/reviewbot/tools/cppcheck.py
+++ b/bot/reviewbot/tools/cppcheck.py
@@ -84,7 +84,7 @@ class CPPCheckTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -120,10 +120,10 @@ class CPPCheckTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/cpplint.py b/bot/reviewbot/tools/cpplint.py
index 7387de5431176a90ea5751bda20b5f74310b1133..0d6c5eb0d0e055fe92621ff69f67e200ccb6764d 100644
--- a/bot/reviewbot/tools/cpplint.py
+++ b/bot/reviewbot/tools/cpplint.py
@@ -67,7 +67,7 @@ class CPPLintTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -91,10 +91,10 @@ class CPPLintTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/doc8.py b/bot/reviewbot/tools/doc8.py
index eceff65bc81bea18b291745a0fa095e2740ab24c..29549ee33908a9b1e3039b00f723ccbfb1e8da8c 100644
--- a/bot/reviewbot/tools/doc8.py
+++ b/bot/reviewbot/tools/doc8.py
@@ -60,7 +60,7 @@ class Doc8Tool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -79,10 +79,10 @@ class Doc8Tool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/fbinfer.py b/bot/reviewbot/tools/fbinfer.py
index 01207ef157ed633f3d8e5a8b0260dc2fd4c58ce3..357c936cd45683ed56827e08cbaa9c50f7331da7 100644
--- a/bot/reviewbot/tools/fbinfer.py
+++ b/bot/reviewbot/tools/fbinfer.py
@@ -108,7 +108,7 @@ class FBInferTool(FullRepositoryToolMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -158,7 +158,7 @@ class FBInferTool(FullRepositoryToolMixin, BaseTool):
             review (reviewbot.processing.review.Review):
                 The review being populated.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run infer.
 
             **kwargs (dict):
@@ -255,13 +255,13 @@ class FBInferTool(FullRepositoryToolMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
             review (reviewbot.processing.review.Review):
                 The review being populated.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run infer.
 
             report (list of dict):
@@ -295,7 +295,7 @@ class FBInferTool(FullRepositoryToolMixin, BaseTool):
         results that pertain to the provided list of paths.
 
         Args:
-            paths (list of unicode):
+            paths (list of str):
                 The list of absolute paths to files used to filter down
                 the report.
 
diff --git a/bot/reviewbot/tools/flake8.py b/bot/reviewbot/tools/flake8.py
index 1e225299e94519b264c9f880bd655a270f2c9df3..08f20cacc4f69336ca2ad32994f4527d85accf3f 100644
--- a/bot/reviewbot/tools/flake8.py
+++ b/bot/reviewbot/tools/flake8.py
@@ -60,7 +60,7 @@ class Flake8Tool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -85,10 +85,10 @@ class Flake8Tool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run flake8.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/gofmt.py b/bot/reviewbot/tools/gofmt.py
index 34202e24aea135a0ed976c72510af66ed869a65d..469d41bf8dded95be0599a00059f199a9fab9fac 100644
--- a/bot/reviewbot/tools/gofmt.py
+++ b/bot/reviewbot/tools/gofmt.py
@@ -32,7 +32,7 @@ class GofmtTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return [
@@ -47,10 +47,10 @@ class GofmtTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/gotool.py b/bot/reviewbot/tools/gotool.py
index 1d80b8380794ce9a30e74bdfcfcd15f23817db82..5a3a4859b0ff180cf81bfbe01a6010ec289ee5c7 100644
--- a/bot/reviewbot/tools/gotool.py
+++ b/bot/reviewbot/tools/gotool.py
@@ -115,10 +115,10 @@ class GoTool(FullRepositoryToolMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            packages (set of unicode):
+            packages (set of str):
                 A set of all package names. This function will add the file's
                 package to this set.
 
@@ -136,7 +136,7 @@ class GoTool(FullRepositoryToolMixin, BaseTool):
         """Execute 'go test' on a given package
 
         Args:
-            package (unicode):
+            package (str):
                 Name of the go package.
 
             review (reviewbot.processing.review.Review):
@@ -207,7 +207,7 @@ class GoTool(FullRepositoryToolMixin, BaseTool):
         """Execute 'go vet' on a given package
 
         Args:
-            package (unicode):
+            package (str):
                 Name of the go package.
 
             patched_files_map (dict):
diff --git a/bot/reviewbot/tools/jshint.py b/bot/reviewbot/tools/jshint.py
index 69ceef384768071537d34fa0f9e6606e52f9dadb..1d0bb8d07b5df68c4a1cb100d4c2fef65a340fc6 100644
--- a/bot/reviewbot/tools/jshint.py
+++ b/bot/reviewbot/tools/jshint.py
@@ -97,7 +97,7 @@ class JSHintTool(FilePatternsFromSettingMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -125,10 +125,10 @@ class JSHintTool(FilePatternsFromSettingMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run JSHint.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/pmd.py b/bot/reviewbot/tools/pmd.py
index 67295f4fd57f2734623cd1fa1d54ca05390aee23..53ffe1d5c703601c5c1f1aae25117d05384cac08 100644
--- a/bot/reviewbot/tools/pmd.py
+++ b/bot/reviewbot/tools/pmd.py
@@ -73,7 +73,7 @@ class PMDTool(JavaToolMixin, FilePatternsFromSettingMixin, BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         rulesets = self.settings['rulesets']
@@ -96,10 +96,10 @@ class PMDTool(JavaToolMixin, FilePatternsFromSettingMixin, BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode, optional):
+            base_command (list of str, optional):
                 The common base command line used for reviewing a file.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/pycodestyle.py b/bot/reviewbot/tools/pycodestyle.py
index 79a08280c2c1e16eca63feac3a2299abf9158509..28544dd30b8517a6b6a54c11db4a0a078435ee52 100644
--- a/bot/reviewbot/tools/pycodestyle.py
+++ b/bot/reviewbot/tools/pycodestyle.py
@@ -56,7 +56,7 @@ class PycodestyleTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -80,10 +80,10 @@ class PycodestyleTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pycodestyle.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/pydocstyle.py b/bot/reviewbot/tools/pydocstyle.py
index 2c4bd700b1d101f663ae4ec6795969f11edb969c..d64333981c0dfd3852ef3a9600f2e8d8189a700c 100644
--- a/bot/reviewbot/tools/pydocstyle.py
+++ b/bot/reviewbot/tools/pydocstyle.py
@@ -53,7 +53,7 @@ class PydocstyleTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -73,10 +73,10 @@ class PydocstyleTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/pyflakes.py b/bot/reviewbot/tools/pyflakes.py
index 801b64d106560d9753013ce1aea7dd7170536e46..aad25b4ac92d1662f991a47e9cc6b927b27c129c 100644
--- a/bot/reviewbot/tools/pyflakes.py
+++ b/bot/reviewbot/tools/pyflakes.py
@@ -33,7 +33,7 @@ class PyflakesTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return [config['exe_paths']['pyflakes']]
@@ -45,10 +45,10 @@ class PyflakesTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run pyflakes.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/rubocop.py b/bot/reviewbot/tools/rubocop.py
index d51f773bbb2ad4ac4f689b211a7d02ea7bbe928f..1b7a1f8f87e1d39f48c27e27a914afbefe687972 100644
--- a/bot/reviewbot/tools/rubocop.py
+++ b/bot/reviewbot/tools/rubocop.py
@@ -50,7 +50,7 @@ class RubocopTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -74,10 +74,10 @@ class RubocopTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run rubocop.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/rustfmt.py b/bot/reviewbot/tools/rustfmt.py
index f41926a831e14000fbe66cc570536813bfd1fe6e..38b77e9edf593e2edd9c949bbcaa14ea44e542bf 100644
--- a/bot/reviewbot/tools/rustfmt.py
+++ b/bot/reviewbot/tools/rustfmt.py
@@ -33,7 +33,7 @@ class RustfmtTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         return [
@@ -50,10 +50,10 @@ class RustfmtTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run rustfmt.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/shellcheck.py b/bot/reviewbot/tools/shellcheck.py
index 1cce866aa78693cf5b71c33d97c61de967f93c9f..84cc8581a62d361fe04a5baea997d3c55b88176b 100644
--- a/bot/reviewbot/tools/shellcheck.py
+++ b/bot/reviewbot/tools/shellcheck.py
@@ -93,7 +93,7 @@ class ShellCheckTool(BaseTool):
                 Additional keyword arguments.
 
         Returns:
-            list of unicode:
+            list of str:
             The base command line.
         """
         settings = self.settings
@@ -121,10 +121,10 @@ class ShellCheckTool(BaseTool):
             f (reviewbot.processing.review.File):
                 The file to process.
 
-            path (unicode):
+            path (str):
                 The local path to the patched file to review.
 
-            base_command (list of unicode):
+            base_command (list of str):
                 The base command used to run shellcheck.
 
             **kwargs (dict, unused):
diff --git a/bot/reviewbot/tools/testing/testcases.py b/bot/reviewbot/tools/testing/testcases.py
index 881821dace353ec07c8c7496abdd9b9295737375..fca9c86c6a0dca19fe834ab141fecc58890f1e59 100644
--- a/bot/reviewbot/tools/testing/testcases.py
+++ b/bot/reviewbot/tools/testing/testcases.py
@@ -92,7 +92,7 @@ class ToolTestCaseMetaclass(type):
             func_name (str):
                 The original name of the function.
 
-            tag (unicode):
+            tag (str):
                 The tag to add.
 
         Returns:
@@ -200,7 +200,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
     #: This is required.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     tool_exe_config_key = None
 
     #: The path to the executable for running the tool.
@@ -210,7 +210,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
     #: test/test suite setup.
     #:
     #: Type:
-    #:     unicode
+    #:     str
     tool_exe_path = None
 
     #: Extra executables needed to run the tool.
@@ -238,7 +238,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
             Added the ``file_contents_encoding`` argument.
 
         Args:
-            filename (unicode):
+            filename (str):
                 The filename of the file being reviewed.
 
             file_contents (bytes, optional):
@@ -247,7 +247,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
             tool_settings (dict, optional):
                 The settings to pass to the tool constructor.
 
-            file_contents_encoding (unicode, optional):
+            file_contents_encoding (str, optional):
                 The encoding used for the provided file contents (both in
                 ``file_contents`` and ``other_contents``).
 
@@ -297,13 +297,13 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
             Added the ``file_contents_encoding`` argument.
 
         Args:
-            filename (unicode):
+            filename (str):
                 The filename of the file being reviewed.
 
             file_contents (bytes):
                 File content to review.
 
-            checkout_dir (unicode, optional):
+            checkout_dir (str, optional):
                 An explicit directory to use as the checkout directory, for
                 tools that require full-repository checkouts.
 
@@ -317,7 +317,7 @@ class BaseToolTestCase(kgb.SpyAgency, TestCase):
                 The dictionary is a map of file paths (relative to the
                 checkout directory) to byte strings.
 
-            file_contents_encoding (unicode, optional):
+            file_contents_encoding (str, optional):
                 The encoding used for the provided file contents (both in
                 ``file_contents`` and ``other_contents``).
 
diff --git a/bot/reviewbot/tools/tests/test_base_tool.py b/bot/reviewbot/tools/tests/test_base_tool.py
index f446a7e352e945132f0c670b9a65d2350827cda2..398b219a4a6cd1000d8ac75302b0c7b8dd956770 100644
--- a/bot/reviewbot/tools/tests/test_base_tool.py
+++ b/bot/reviewbot/tools/tests/test_base_tool.py
@@ -192,14 +192,14 @@ class BaseToolTests(kgb.SpyAgency, TestCase):
         """Set up an environment for dependency checks.
 
         Args:
-            filenames (list of unicode, optional):
+            filenames (list of str, optional):
                 A list of executable filenames to write to the tmep directory.
 
             set_path (bool, optional):
                 Whether to set the :envvar:`PATH` environment variable.
 
         Context:
-            unicode:
+            str:
             The generated temp directory.
         """
         tempdir = tempfile.mkdtemp()
diff --git a/bot/reviewbot/tools/tests/test_cargotool.py b/bot/reviewbot/tools/tests/test_cargotool.py
index 10af02e436e14eee7a468ef1e7d550fa5ce612ca..d2c58a976c7071294d732dd86317e898d5770c2c 100644
--- a/bot/reviewbot/tools/tests/test_cargotool.py
+++ b/bot/reviewbot/tools/tests/test_cargotool.py
@@ -965,7 +965,7 @@ class CargoToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided data.
 
         Args:
-            output (unicode):
+            output (str):
                 The outputted data.
         """
         output = [
diff --git a/bot/reviewbot/tools/tests/test_checkstyle.py b/bot/reviewbot/tools/tests/test_checkstyle.py
index 19e5da692aebcb68b220c77a24624991cdccb476..062a96dcc04943f9db0c39cca29af6ceae65b4e5 100644
--- a/bot/reviewbot/tools/tests/test_checkstyle.py
+++ b/bot/reviewbot/tools/tests/test_checkstyle.py
@@ -390,7 +390,7 @@ class CheckstyleToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided payload.
 
         Args:
-            output (unicode):
+            output (str):
                 The outputted payload.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn(output))
diff --git a/bot/reviewbot/tools/tests/test_clang.py b/bot/reviewbot/tools/tests/test_clang.py
index 5886ddef0df5961012161de81a8e62d02b7b1ce9..3329e6fe66503f347b942fb1dff56518d0364b0f 100644
--- a/bot/reviewbot/tools/tests/test_clang.py
+++ b/bot/reviewbot/tools/tests/test_clang.py
@@ -575,7 +575,7 @@ class ClangToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
             plist_data (dict, optional):
                 The simulated plist data, if simulating a successful run.
 
-            output (unicode, optional):
+            output (str, optional):
                 The resulting compiler output, if simulating a compiler error.
         """
         @self.spy_for(execute)
diff --git a/bot/reviewbot/tools/tests/test_cppcheck.py b/bot/reviewbot/tools/tests/test_cppcheck.py
index 66dc6486a303ab026078d7f5e1686dd22e19ee66..2279e4f0b7aaf786282f25403a27543d717402a8 100644
--- a/bot/reviewbot/tools/tests/test_cppcheck.py
+++ b/bot/reviewbot/tools/tests/test_cppcheck.py
@@ -325,7 +325,7 @@ class CPPCheckToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided stdout and stderr results.
 
         Args:
-            output (unicode):
+            output (str):
                 The outputted results from cppcheck.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn(output))
diff --git a/bot/reviewbot/tools/tests/test_cpplint.py b/bot/reviewbot/tools/tests/test_cpplint.py
index 949bfe6e94123cc19c6f9fcbb9339fa4ccf434f6..9bd75e35bf5af25d6c3fe9e046ca72da6ee366b1 100644
--- a/bot/reviewbot/tools/tests/test_cpplint.py
+++ b/bot/reviewbot/tools/tests/test_cpplint.py
@@ -309,7 +309,7 @@ class CPPLintToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided stdout and stderr results.
 
         Args:
-            output (unicode):
+            output (str):
                 The outputted results from cpplint.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn(output))
diff --git a/bot/reviewbot/tools/tests/test_doc8.py b/bot/reviewbot/tools/tests/test_doc8.py
index c2717a98e4f13e2f0c7f60ee2b67d2561d268844..7990e78bed04e192c15f1a88668ae8df21db6a72 100644
--- a/bot/reviewbot/tools/tests/test_doc8.py
+++ b/bot/reviewbot/tools/tests/test_doc8.py
@@ -220,7 +220,7 @@ class Doc8ToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided output.
 
         Args:
-            output (list of unicode):
+            output (list of str):
                 The simulated output from the tool.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn(output))
diff --git a/bot/reviewbot/tools/tests/test_fbinfer.py b/bot/reviewbot/tools/tests/test_fbinfer.py
index a826e4be24575328db0838f37fb6d79f743d1643..356228da78590957556dcff0cdff212df2f4cae6 100644
--- a/bot/reviewbot/tools/tests/test_fbinfer.py
+++ b/bot/reviewbot/tools/tests/test_fbinfer.py
@@ -383,7 +383,7 @@ class FBInferToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         """Set up an integration test.
 
         Args:
-            exe_deps (list of unicode):
+            exe_deps (list of str):
                 Dependencies required by this test.
 
             **kwargs (dict):
@@ -413,7 +413,7 @@ class FBInferToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
             full_report (list, optional):
                 A full report file contents to write.
 
-            output (unicode, optional):
+            output (str, optional):
                 Output to return when executing a command.
         """
         if full_report is not None:
diff --git a/bot/reviewbot/tools/tests/test_gofmt.py b/bot/reviewbot/tools/tests/test_gofmt.py
index 361ef2a6ba403af9c84b6f6c59ac35ac903b1c05..a2def251cbdac1d7c4f3b08d20739593d8d3aa4d 100644
--- a/bot/reviewbot/tools/tests/test_gofmt.py
+++ b/bot/reviewbot/tools/tests/test_gofmt.py
@@ -131,10 +131,10 @@ class GofmtToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided stdout and stderr results.
 
         Args:
-            stdout (unicode, optional):
+            stdout (str, optional):
                 The outputted stdout.
 
-            stderr (unicode, optional):
+            stderr (str, optional):
                 The outputted stderr.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn((stdout, stderr)))
diff --git a/bot/reviewbot/tools/tests/test_gotool.py b/bot/reviewbot/tools/tests/test_gotool.py
index 71e86266b7a878972b4874b1d21a36440c330d67..f0cfb87afccfc6125e253c4353e38a8d5b3d9f04 100644
--- a/bot/reviewbot/tools/tests/test_gotool.py
+++ b/bot/reviewbot/tools/tests/test_gotool.py
@@ -574,10 +574,10 @@ class GoToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided output.
 
         Args:
-            test_output (list of unicode, optional):
+            test_output (list of str, optional):
                 The outputted content from :command:`go test`.
 
-            vet_output (unicode, optional):
+            vet_output (str, optional):
                 The outputted content from :command:`go vet`.
         """
         @self.spy_for(execute)
diff --git a/bot/reviewbot/tools/tests/test_pmd.py b/bot/reviewbot/tools/tests/test_pmd.py
index 58f11c0a0b94b0c802decbc24acec62a2f465ece..7e0dbfdf80d7e0aadb2cc30da4e9b61b66c3cd11 100644
--- a/bot/reviewbot/tools/tests/test_pmd.py
+++ b/bot/reviewbot/tools/tests/test_pmd.py
@@ -575,7 +575,7 @@ class PMDToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
                 The output payload to serialize to JSON. If not provided, a
                 file will not be written.
 
-            stderr (unicode, optional):
+            stderr (str, optional):
                 The error output to simulate from PMD.
         """
         assert isinstance(stderr, str)
diff --git a/bot/reviewbot/tools/tests/test_pydocstyle.py b/bot/reviewbot/tools/tests/test_pydocstyle.py
index 3e13b513481fdb0b31bded206df2cbd8a89b93e1..8a7ff94ac7524887db192c3a96bc9f6097de329a 100644
--- a/bot/reviewbot/tools/tests/test_pydocstyle.py
+++ b/bot/reviewbot/tools/tests/test_pydocstyle.py
@@ -208,7 +208,7 @@ class PydocstyleToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided output.
 
         Args:
-            output (unicode):
-                The simulatedo output from the tool.
+            output (str):
+                The simulated output from the tool.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn(output))
diff --git a/bot/reviewbot/tools/tests/test_pyflakes.py b/bot/reviewbot/tools/tests/test_pyflakes.py
index 537c5666fb7dbaaa26e45060f290f44eaae29755..dfb3a24660a49f72d52e9df28a8df18192eee532 100644
--- a/bot/reviewbot/tools/tests/test_pyflakes.py
+++ b/bot/reviewbot/tools/tests/test_pyflakes.py
@@ -148,10 +148,10 @@ class PyflakesToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided stdout and stderr results.
 
         Args:
-            stdout (list of unicode, optional):
+            stdout (list of str, optional):
                 The outputted stdout.
 
-            stderr (list of unicode, optional):
+            stderr (list of str, optional):
                 The outputted stderr.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn((stdout, stderr)))
diff --git a/bot/reviewbot/tools/tests/test_rbsecretscanner.py b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
index 1887cd59799dcc6500435f41de32a036f68c5ea4..7ca6463fb004c2aa9c628cfeef11926777f1f00f 100644
--- a/bot/reviewbot/tools/tests/test_rbsecretscanner.py
+++ b/bot/reviewbot/tools/tests/test_rbsecretscanner.py
@@ -717,7 +717,7 @@ class SecretScannerToolTests(BaseToolTestCase,
         """Run an execution test with a given token.
 
         Args:
-            token (unicode):
+            token (str):
                 The token to test for.
 
             match (bool, optional):
diff --git a/bot/reviewbot/tools/tests/test_rubocop.py b/bot/reviewbot/tools/tests/test_rubocop.py
index 882bd70ffc0d5216330568cf9ca917738d0763df..40d1e758a6d8dc805bbf1aed072ec362d3222ffe 100644
--- a/bot/reviewbot/tools/tests/test_rubocop.py
+++ b/bot/reviewbot/tools/tests/test_rubocop.py
@@ -534,7 +534,7 @@ class RubocopToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided payload (serializing to JSON if a dictionary).
 
         Args:
-            output_payload (dict or unicode):
+            output_payload (dict or str):
                 The payload to return.
         """
         if isinstance(output_payload, dict):
diff --git a/bot/reviewbot/tools/tests/test_rustfmt.py b/bot/reviewbot/tools/tests/test_rustfmt.py
index 5fb6c07ac72dd6958dd0a5b5e2ccb1694798bb2a..a4dc30cccaee322da903dde0ec224d12ab966d01 100644
--- a/bot/reviewbot/tools/tests/test_rustfmt.py
+++ b/bot/reviewbot/tools/tests/test_rustfmt.py
@@ -150,10 +150,10 @@ class RustfmtToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         it return the provided stdout and stderr results.
 
         Args:
-            stdout (unicode, optional):
+            stdout (str, optional):
                 The outputted stdout.
 
-            stderr (unicode, optional):
+            stderr (str, optional):
                 The outputted stderr.
         """
         self.spy_on(execute, op=kgb.SpyOpReturn((stdout, stderr)))
diff --git a/bot/reviewbot/tools/tests/test_shellcheck.py b/bot/reviewbot/tools/tests/test_shellcheck.py
index 581918b3dc1cbc9e62c78dcfe59f2b2614c37cda..0be2a8c772bf6eddc4940f9d7b20434580ef5158 100644
--- a/bot/reviewbot/tools/tests/test_shellcheck.py
+++ b/bot/reviewbot/tools/tests/test_shellcheck.py
@@ -546,7 +546,7 @@ class ShellCheckToolTests(BaseToolTestCase, metaclass=ToolTestCaseMetaclass):
         payload directly, if it's a string).
 
         Args:
-            output_payload (dict or unicode):
+            output_payload (dict or str):
                 The payload to output.
         """
         if isinstance(output_payload, dict):
diff --git a/bot/reviewbot/utils/api.py b/bot/reviewbot/utils/api.py
index 9d193fef06b7063e894a93cd0ee55c98e7c5a621..23a5fcdf92e35815f9270d4bd1e5cbe93a9e2e74 100644
--- a/bot/reviewbot/utils/api.py
+++ b/bot/reviewbot/utils/api.py
@@ -22,16 +22,16 @@ def get_api_root(url, username=None, api_token=None, session=None):
         3.0
 
     Args:
-        url (unicode):
+        url (str):
             The path to the Review Board server.
 
-        username (unicode, optional):
+        username (str, optional):
             The username used for authentication.
 
-        api_token (unicode, optional):
+        api_token (str, optional):
             The API token used for authentication.
 
-        session (unicode, optional):
+        session (str, optional):
             An existing Review Board session identifier.
 
     Returns:
diff --git a/bot/reviewbot/utils/filesystem.py b/bot/reviewbot/utils/filesystem.py
index cdfa1431fc8f2ebe32ae18b5cbf07098e574fc46..be77825070e31f25ebf76e2799f3bae011bbf11f 100644
--- a/bot/reviewbot/utils/filesystem.py
+++ b/bot/reviewbot/utils/filesystem.py
@@ -59,7 +59,7 @@ def chdir(path):
     """Temporarily change directory into the given working directory.
 
     Args:
-        path (unicode):
+        path (str):
             The directory to operate within.
     """
     cwd = os.getcwd()
@@ -104,11 +104,11 @@ def make_tempfile(content=None, extension=''):
         content (bytes, optional):
             Optional content to put in the file.
 
-        extension (unicode, optional):
+        extension (str, optional):
             An optional file extension to add to the end of the filename.
 
     Returns:
-        unicode:
+        str:
         The name of the new file.
     """
     global tmpfiles
@@ -126,7 +126,7 @@ def make_tempdir():
     """Create a temporary directory and return the path.
 
     Returns:
-        unicode:
+        str:
         The name of the new directory.
     """
     global tmpdirs
@@ -140,7 +140,7 @@ def ensure_dirs_exist(path):
     """Ensure directories exist to an absolute path.
 
     Args:
-        path (unicode):
+        path (str):
             The absolute path for which directories should be created if they
             don't exist.
 
@@ -169,7 +169,7 @@ def get_path_platform(path):
         3.0
 
     Args:
-        path (unicode):
+        path (str):
             The Windows or POSIX path.
 
     Returns:
@@ -221,10 +221,10 @@ def normalize_platform_path(path, relative_to=None,
         3.0
 
     Args:
-        path (unicode):
+        path (str):
             The path to normalize.
 
-        relative_to (unicode, optional):
+        relative_to (str, optional):
             An optional directory that the normalized path should be joined
             to.
 
@@ -233,7 +233,7 @@ def normalize_platform_path(path, relative_to=None,
             for unit testing purposes.
 
     Returns:
-        unicode:
+        str:
         The resulting normalized path.
 
     Raises:
diff --git a/bot/reviewbot/utils/log.py b/bot/reviewbot/utils/log.py
index 457472ef442078cf8c4fe8634dde0db2b55a4958..452554cd8b6321a22d2569a0d425c400ddda6213 100644
--- a/bot/reviewbot/utils/log.py
+++ b/bot/reviewbot/utils/log.py
@@ -25,7 +25,7 @@ def get_logger(name, is_task_logger=True):
         3.0
 
     Args:
-        name (unicode):
+        name (str):
             The name shown in the log line. This is expected to be a module
             name.
 
diff --git a/bot/reviewbot/utils/process.py b/bot/reviewbot/utils/process.py
index 94f992e4b609279521afe1a7870644f2e5b371f8..8bf66c4594a2622ca182e7a44f41a0e5318825d5 100644
--- a/bot/reviewbot/utils/process.py
+++ b/bot/reviewbot/utils/process.py
@@ -24,7 +24,7 @@ def execute(command,
     """Execute a command and return the output.
 
     Args:
-        command (list of unicode):
+        command (list of str):
             The command to run.
 
         env (dict, optional):
@@ -144,7 +144,7 @@ def is_exe_in_path(name, cache={}):
         Added the ``cache`` parameter.
 
     Args:
-        name (unicode):
+        name (str):
             The name of the executable, without any platform-specific
             executable extension. The extension will be appended if necessary.
 
diff --git a/bot/reviewbot/utils/tests/test_filesystem.py b/bot/reviewbot/utils/tests/test_filesystem.py
index 47cbe0aa84c8892a35309dd0b077f98d96af1338..5ed7f9264f82564989daffc6061ee838f88a7b10 100644
--- a/bot/reviewbot/utils/tests/test_filesystem.py
+++ b/bot/reviewbot/utils/tests/test_filesystem.py
@@ -242,19 +242,19 @@ class NormalizePlatformPath(TestCase):
         Linux, with or without relative paths.
 
         Args:
-            path (unicode):
+            path (str):
                 The path to normalize.
 
-            expected_posix_path (unicode):
+            expected_posix_path (str):
                 The expected resulting POSIX path.
 
-            expected_windows_path (unicode):
+            expected_windows_path (str):
                 The expected resulting Windows path.
 
-            relative_to_posix (unicode, optional):
+            relative_to_posix (str, optional):
                 An optional path to prepend to the normalized POSIX path.
 
-            relative_to_windows (unicode, optional):
+            relative_to_windows (str, optional):
                 An optional path to prepend to the normalized Windows path.
 
         Raises:
diff --git a/bot/reviewbot/utils/text.py b/bot/reviewbot/utils/text.py
index d0b80c5226ba57671e9a19edfd81698651ea1aaf..c7a3a383b195e7250b3ed528e887f5ea0547f731 100644
--- a/bot/reviewbot/utils/text.py
+++ b/bot/reviewbot/utils/text.py
@@ -43,11 +43,11 @@ def split_comma_separated(s):
     Any blank values will be filtered out.
 
     Args:
-        s (unicode):
+        s (str):
             The string to split.
 
     Returns:
-        list of unicode:
+        list of str:
         The list of values.
     """
     return [
