diff --git a/INSTALL.md b/INSTALL.md
index 22f7b7c0293c32c9c5a82ebe6bac6da75a9cec91..c6fcb3bd7f2a87cc2989b7ab3efc2db05b8e7517 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -57,7 +57,7 @@ light workloads.
 System requirements:
 
 - POSIX-compliant system (tested on Linux & OS X)
-- Python 3.5.2 or later, up to Python 3.8.
+- Python 3.5.2 or later, up to Python 3.9.
 - At least 1GB of free RAM if you want to join large public rooms like #matrix:matrix.org
 
 Synapse is written in Python but some of the libraries it uses are written in
diff --git a/changelog.d/8665.doc b/changelog.d/8665.doc
new file mode 100644
index 0000000000000000000000000000000000000000..3b75307dc5ab001746b5e51f4c2bf0a7b63e518d
--- /dev/null
+++ b/changelog.d/8665.doc
@@ -0,0 +1 @@
+Note support for Python 3.9.
diff --git a/setup.py b/setup.py
index 2f4a3170d268d59d70d4a4425d2dee569bf13b97..9730afb41b5467236e048859335d901148972546 100755
--- a/setup.py
+++ b/setup.py
@@ -131,6 +131,7 @@ setup(
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
     ],
     scripts=["synctl"] + glob.glob("scripts/*"),
     cmdclass={"test": TestCommand},
diff --git a/tox.ini b/tox.ini
index 6dcc439a4038f51c03602713b8fbb9f038730022..6a507d30128960eaf696b91ce7d073c79f4956cb 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = packaging, py35, py36, py37, py38, check_codestyle, check_isort
+envlist = packaging, py35, py36, py37, py38, py39, check_codestyle, check_isort
 
 [base]
 extras = test