diff --git a/changelog.d/15007.misc b/changelog.d/15007.misc
new file mode 100644
index 0000000000000000000000000000000000000000..93ceaeafc9b9dc64318ac4ab848558c42c059cd8
--- /dev/null
+++ b/changelog.d/15007.misc
@@ -0,0 +1 @@
+Improve type hints.
diff --git a/mypy.ini b/mypy.ini
index 11e683b7042ca1c05327e8d59ad7d0838b67f46c..0efafb26b6a614da03e956a3c2d02bfebbbeefd9 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -35,7 +35,6 @@ exclude = (?x)
    |tests/module_api/test_api.py
    |tests/rest/media/v1/test_media_storage.py
    |tests/server.py
-   |tests/test_terms_auth.py
    )$
 
 [mypy-synapse.federation.transport.client]
@@ -119,6 +118,9 @@ disallow_untyped_defs = True
 [mypy-tests.test_state]
 disallow_untyped_defs = True
 
+[mypy-tests.test_terms_auth]
+disallow_untyped_defs = True
+
 [mypy-tests.types.*]
 disallow_untyped_defs = True
 
diff --git a/tests/test_terms_auth.py b/tests/test_terms_auth.py
index abd7459a8cb70b39fbea484b8f417ad4352418b0..52424aa0871375e2d7b9f23d5a24b4deb51834e5 100644
--- a/tests/test_terms_auth.py
+++ b/tests/test_terms_auth.py
@@ -14,9 +14,12 @@
 
 from unittest.mock import Mock
 
-from twisted.test.proto_helpers import MemoryReactorClock
+from twisted.internet.interfaces import IReactorTime
+from twisted.test.proto_helpers import MemoryReactor, MemoryReactorClock
 
 from synapse.rest.client.register import register_servlets
+from synapse.server import HomeServer
+from synapse.types import JsonDict
 from synapse.util import Clock
 
 from tests import unittest
@@ -25,7 +28,7 @@ from tests import unittest
 class TermsTestCase(unittest.HomeserverTestCase):
     servlets = [register_servlets]
 
-    def default_config(self):
+    def default_config(self) -> JsonDict:
         config = super().default_config()
         config.update(
             {
@@ -40,17 +43,21 @@ class TermsTestCase(unittest.HomeserverTestCase):
         )
         return config
 
-    def prepare(self, reactor, clock, hs):
-        self.clock = MemoryReactorClock()
+    def prepare(
+        self, reactor: MemoryReactor, clock: Clock, homeserver: HomeServer
+    ) -> None:
+        # type-ignore: mypy-zope doesn't seem to recognise that MemoryReactorClock
+        # implements IReactorTime, via inheritance from twisted.internet.testing.Clock
+        self.clock: IReactorTime = MemoryReactorClock()  # type: ignore[assignment]
         self.hs_clock = Clock(self.clock)
         self.url = "/_matrix/client/r0/register"
         self.registration_handler = Mock()
         self.auth_handler = Mock()
         self.device_handler = Mock()
 
-    def test_ui_auth(self):
+    def test_ui_auth(self) -> None:
         # Do a UI auth request
-        request_data = {"username": "kermit", "password": "monkey"}
+        request_data: JsonDict = {"username": "kermit", "password": "monkey"}
         channel = self.make_request(b"POST", self.url, request_data)
 
         self.assertEqual(channel.code, 401, channel.result)