diff --git a/.pylintrc-local.yml b/.pylintrc-local.yml
index b3478b184e32ba7a1b2f612628f8c8bbc23bee6f..c6882019185353577ff774b15283bef801e95624 100644
--- a/.pylintrc-local.yml
+++ b/.pylintrc-local.yml
@@ -1,3 +1,6 @@
+- arg: py-version
+  val: '3.10'
+
 - arg: ignore
   val:
     - firedrake
diff --git a/meshmode/discretization/poly_element.py b/meshmode/discretization/poly_element.py
index 91adcf4d7a0363502a823a6b29fbb3cc91e68956..b459e29d1f4bccefc4e2e33a5530c19576136798 100644
--- a/meshmode/discretization/poly_element.py
+++ b/meshmode/discretization/poly_element.py
@@ -939,9 +939,8 @@ def default_simplex_group_factory(base_dim, order):
     """
 
     try:
-        # recursivenodes is only importable in Python 3.8 since
-        # it uses :func:`math.comb`, so need to check if it can
-        # be imported.
+        # FIXME: this is a hard dependency (in pyproject.toml) now, so this
+        # shouldn't be needed
         import recursivenodes  # noqa: F401
     except ImportError:
         # If it cannot be imported, use warp-and-blend nodes.
diff --git a/meshmode/mesh/__init__.py b/meshmode/mesh/__init__.py
index c11374893f4bf564b5b31b1b9678177b9825371d..e2f87b21c946552aed4b07745a2ad612a3252fb5 100644
--- a/meshmode/mesh/__init__.py
+++ b/meshmode/mesh/__init__.py
@@ -37,6 +37,7 @@ from typing import (
     Literal,
     Mapping,
     Sequence,
+    TypeAlias,
     TypeVar,
     Union,
 )
@@ -44,7 +45,6 @@ from warnings import warn
 
 import numpy as np
 import numpy.linalg as la
-from typing_extensions import TypeAlias
 
 import modepy as mp
 from pytools import memoize_method
diff --git a/pyproject.toml b/pyproject.toml
index c844670218662cf69f48ba8079b04ff7f0f214ab..f3173785f4833a880f173f07c40ad7c8ef8d231e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,14 +6,14 @@ requires = [
 
 [project]
 name = "meshmode"
-version = "2021.2"
+version = "2024.0"
 description = "High-order polynomial discretizations of and on meshes"
 readme = "README.rst"
 license = { text = "MIT" }
 authors = [
     { name = "Andreas Kloeckner", email = "inform@tiker.net" },
 ]
-requires-python = ">=3.8"
+requires-python = ">=3.10"
 classifiers = [
     "Development Status :: 3 - Alpha",
     "Intended Audience :: Developers",
@@ -39,9 +39,6 @@ dependencies = [
     "pymbolic>=2022.2",
     "pytools>=2022.1",
     "recursivenodes",
-
-    # for TypeAlias
-    "typing-extensions>=4; python_version<'3.10'",
 ]
 
 [project.optional-dependencies]
@@ -144,7 +141,7 @@ markers = [
 ]
 
 [tool.mypy]
-python_version = "3.8"
+python_version = "3.10"
 warn_unused_ignores = true
 
 [[tool.mypy.overrides]]