diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 1.2.1.2 (January 7th, 2022)
+
+- Compatibility with `template-haskell` versions through 2.18 (which is distributed with GHC 9.2) ([#34](https://github.com/lexi-lambda/freer-simple/issues/34)).
+
 # 1.2.1.1 (October 4th, 2019)
 
 - Loosened bounds on `template-haskell` ([#29](https://github.com/lexi-lambda/freer-simple/issues/29)).
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,45 +1,37 @@
-# Freer: Extensible Effects with Freer Monads [![Build Status](https://travis-ci.org/lexi-lambda/freer-simple.svg?branch=master)](https://travis-ci.org/lexi-lambda/freer-simple)
-
-# Description
-
-The `freer-simple` library (a fork of [`freer-effects`](http://hackage.haskell.org/package/freer-effects)) is an implementation of an effect system for Haskell, which is based on the work of Oleg Kiselyov et al.:
-
-  - [Freer Monads, More Extensible Effects](http://okmij.org/ftp/Haskell/extensible/more.pdf)
-  - [Reflection without Remorse](http://okmij.org/ftp/Haskell/zseq.pdf)
-  - [Extensible Effects](http://okmij.org/ftp/Haskell/extensible/exteff.pdf)
-
-Much of the implementation is a repackaging and cleaning up of the reference materials provided [here](http://okmij.org/ftp/Haskell/extensible/).
+# freer-simple — a friendly effect system for Haskell [![Build Status](https://img.shields.io/github/workflow/status/lexi-lambda/freer-simple/build/master)](https://github.com/lexi-lambda/freer-simple/actions/workflows/build.yml) [![Hackage](https://img.shields.io/badge/hackage-1.2.1.2-5e5184)][hackage]
 
-# Features
+The `freer-simple` library is an implementation of an *extensible effect system* for Haskell, a general-purpose way of tracking effects at the type level and handling them in different ways. The concept of an “effect” is very general: it encompasses the things most people consider side-effects, like generating random values, interacting with the file system, and mutating state, but it also includes things like access to an immutable global environment and exception handling.
 
 The key features of `freer-simple` are:
 
   - An efficient effect system for Haskell as a library.
-  - Implementations for several common Haskell monads as effects:
-    - `Reader`
-    - `Writer`
-    - `State`
-    - `Trace`
-    - `Error`
-  - Core components for defining your own Effects.
 
-# Example: Console DSL
+  - Implementations for several common Haskell monads as effects, including `Reader`, `Writer`, `State`, `Error`, and others.
 
-Here's what using `freer-simple` looks like:
+  - A combinator language for defining your own effects, designed to make simple, common use cases easy to read and write.
 
+[**For more details, see the package documentation on Hackage.**][hackage]
+
+## Code example
+
 ```haskell
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
-module Console where
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeOperators #-}
 
+import qualified Prelude
+import qualified System.Exit
+
+import Prelude hiding (putStrLn, getLine)
+
 import Control.Monad.Freer
+import Control.Monad.Freer.TH
 import Control.Monad.Freer.Error
 import Control.Monad.Freer.State
 import Control.Monad.Freer.Writer
-import System.Exit hiding (ExitCode(ExitSuccess))
 
 --------------------------------------------------------------------------------
                                -- Effect Model --
@@ -48,24 +40,16 @@
   PutStrLn    :: String -> Console ()
   GetLine     :: Console String
   ExitSuccess :: Console ()
-
-putStrLn' :: Member Console effs => String -> Eff effs ()
-putStrLn' = send . PutStrLn
-
-getLine' :: Member Console effs => Eff effs String
-getLine' = send GetLine
-
-exitSuccess' :: Member Console effs => Eff effs ()
-exitSuccess' = send ExitSuccess
+makeEffect ''Console
 
 --------------------------------------------------------------------------------
                           -- Effectful Interpreter --
 --------------------------------------------------------------------------------
 runConsole :: Eff '[Console, IO] a -> IO a
 runConsole = runM . interpretM (\case
-  PutStrLn msg -> putStrLn msg
-  GetLine -> getLine
-  ExitSuccess -> exitSuccess)
+  PutStrLn msg -> Prelude.putStrLn msg
+  GetLine -> Prelude.getLine
+  ExitSuccess -> System.Exit.exitSuccess)
 
 --------------------------------------------------------------------------------
                              -- Pure Interpreter --
@@ -82,37 +66,8 @@
     go ExitSuccess = throwError ()
 ```
 
-# Contributing
-
-Contributions are welcome! Documentation, examples, code, and feedback - they all help.
-
-
-## Developer Setup
-
-The easiest way to start contributing is to install [stack](https://haskellstack.org/). Stack can install GHC/Haskell for you, and automates common developer tasks.
-
-The key commands are:
-
-  - `stack setup` — install required version of GHC compiler
-  - `stack build` — builds project, dependencies are automatically resolved
-  - `stack test` — builds project, its tests, and executes the tests
-  - `stack bench` — builds project, its benchmarks, and executes the benchamks
-  - `stack ghci` — start a REPL instance with a project modules loaded
-  - `stack clean`
-  - `stack haddock` — builds documentation
-
-More information about `stack` can be found in its [documentation](https://haskellstack.org/).
-
-# Licensing
-
-This project is distributed under a BSD3 license. See the included LICENSE file for more details.
-
-# Acknowledgements
-
-The `freer-simple` package started as a fork of [freer-effects](http://hackage.haskell.org/package/freer-effects) by Ixperta Solutions, which in turn is a fork of [freer](http://hackage.haskell.org/package/freer) by Allele Dev. All implementations are based on the paper and reference implementation by Oleg Kiselyov. In particular:
+## Acknowledgements
 
-  - `Data.OpenUnion` maps to [OpenUnion51.hs](http://okmij.org/ftp/Haskell/extensible/OpenUnion51.hs)
-  - `Data.FTCQueue` maps to [FTCQueue1](http://okmij.org/ftp/Haskell/extensible/FTCQueue1.hs)
-  - `Control.Monad.Freer*` maps to [Eff1.hs](http://okmij.org/ftp/Haskell/extensible/Eff1.hs)
+The `freer-simple` package began as a fork of [freer-effects](http://hackage.haskell.org/package/freer-effects) by Ixperta Solutions, which in turn is a fork of [freer](http://hackage.haskell.org/package/freer) by Allele Dev. All implementations are based on the [paper and reference implementation by Oleg Kiselyov](http://okmij.org/ftp/Haskell/extensible/more.pdf).
 
-There will be deviations from the source.
+[hackage]: https://hackage.haskell.org/package/freer-simple
diff --git a/freer-simple.cabal b/freer-simple.cabal
--- a/freer-simple.cabal
+++ b/freer-simple.cabal
@@ -1,131 +1,136 @@
-cabal-version: 1.12
+cabal-version: 2.4
+name: freer-simple
+version: 1.2.1.2
+category: Control
+build-type: Simple
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
---
--- see: https://github.com/sol/hpack
---
--- hash: e4aaad91d9a0583e046511c8522b9aec2a8612ad7929b48c2c3869ec6fd9fa6c
+synopsis: A friendly effect system for Haskell.
+description:
+  An implementation of an effect system for Haskell (a fork of
+  <http://hackage.haskell.org/package/freer-effects freer-effects>), which is
+  based on the work of Oleg Kiselyov et al.:
+  .
+    * <http://okmij.org/ftp/Haskell/extensible/more.pdf Freer Monads, More Extensible Effects>
+    * <http://okmij.org/ftp/Haskell/zseq.pdf Reflection without Remorse>
+    * <http://okmij.org/ftp/Haskell/extensible/exteff.pdf Extensible Effects>
+  .
+  The key features are:
+  .
+    * An efficient effect system for Haskell - as a library!
+    * Reimplementations of several common Haskell monad transformers as effects.
+    * Core components for defining your own Effects.
 
-name:           freer-simple
-version:        1.2.1.1
-synopsis:       Implementation of a friendly effect system for Haskell.
-description:    An implementation of an effect system for Haskell (a fork of
-                <http://hackage.haskell.org/package/freer-effects freer-effects>), which is
-                based on the work of Oleg Kiselyov et al.:
-                .
-                  * <http://okmij.org/ftp/Haskell/extensible/more.pdf Freer Monads, More Extensible Effects>
-                  * <http://okmij.org/ftp/Haskell/zseq.pdf Reflection without Remorse>
-                  * <http://okmij.org/ftp/Haskell/extensible/exteff.pdf Extensible Effects>
-                .
-                The key features are:
-                .
-                  * An efficient effect system for Haskell - as a library!
-                  * Reimplementations of several common Haskell monad transformers as effects.
-                  * Core components for defining your own Effects.
-category:       Control
-homepage:       https://github.com/lexi-lambda/freer-simple#readme
-bug-reports:    https://github.com/lexi-lambda/freer-simple/issues
-author:         Allele Dev, Ixcom Core Team, Alexis King, and other contributors
-maintainer:     Alexis King <lexi.lambda@gmail.com>
-copyright:      (c) 2016 Allele Dev; 2017 Ixperta Solutions s.r.o.; 2017 Alexis King
-license:        BSD3
-license-file:   LICENSE
-build-type:     Simple
+author: Allele Dev, Ixcom Core Team, Alexis King, and other contributors
+maintainer: Alexis King <lexi.lambda@gmail.com>
+copyright: 2016 Allele Dev; 2017 Ixperta Solutions s.r.o.; 2017 Alexis King
+license: BSD-3-Clause
+license-file: LICENSE
+homepage: https://github.com/lexi-lambda/freer-simple
+bug-reports: https://github.com/lexi-lambda/freer-simple/issues
+
 extra-source-files:
-    CHANGELOG.md
-    README.md
+  CHANGELOG.md
+  README.md
 
 source-repository head
   type: git
   location: https://github.com/lexi-lambda/freer-simple
 
+common common
+  ghc-options:
+    -Wall
+    -Wcompat
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
+
+  default-language: Haskell2010
+  default-extensions:
+    ConstraintKinds
+    DataKinds
+    DeriveFunctor
+    FlexibleContexts
+    FlexibleInstances
+    FunctionalDependencies
+    GADTs
+    LambdaCase
+    MultiParamTypeClasses
+    RankNTypes
+    ScopedTypeVariables
+    TypeApplications
+    TypeOperators
+
+  build-depends: base >= 4.9 && < 5
+
 library
+  import: common
+  hs-source-dirs: src
   exposed-modules:
-      Control.Monad.Freer
-      Control.Monad.Freer.Coroutine
-      Control.Monad.Freer.Error
-      Control.Monad.Freer.Fresh
-      Control.Monad.Freer.Internal
-      Control.Monad.Freer.NonDet
-      Control.Monad.Freer.Reader
-      Control.Monad.Freer.State
-      Control.Monad.Freer.TH
-      Control.Monad.Freer.Trace
-      Control.Monad.Freer.Writer
-      Data.FTCQueue
-      Data.OpenUnion
-      Data.OpenUnion.Internal
-  other-modules:
-      Paths_freer_simple
-  hs-source-dirs:
-      src
-  default-extensions: ConstraintKinds DataKinds DeriveFunctor FlexibleContexts FlexibleInstances FunctionalDependencies GADTs LambdaCase MultiParamTypeClasses RankNTypes ScopedTypeVariables TypeApplications TypeOperators
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
+    Control.Monad.Freer
+    Control.Monad.Freer.Coroutine
+    Control.Monad.Freer.Error
+    Control.Monad.Freer.Fresh
+    Control.Monad.Freer.Internal
+    Control.Monad.Freer.NonDet
+    Control.Monad.Freer.Reader
+    Control.Monad.Freer.State
+    Control.Monad.Freer.TH
+    Control.Monad.Freer.Trace
+    Control.Monad.Freer.Writer
+    Data.FTCQueue
+    Data.OpenUnion
+    Data.OpenUnion.Internal
+
   build-depends:
-      base >=4.9 && <5
-    , natural-transformation >=0.2
-    , template-haskell >=2.11 && <2.16
+    , natural-transformation >= 0.2
     , transformers-base
-  default-language: Haskell2010
+    , template-haskell >= 2.11 && < 2.19
 
-executable freer-examples
+executable freer-simple-examples
+  import: common
+  hs-source-dirs: examples/src
   main-is: Main.hs
   other-modules:
-      Capitalize
-      Console
-      Coroutine
-      Fresh
-      Trace
-      Paths_freer_simple
-  hs-source-dirs:
-      examples/src
-  default-extensions: ConstraintKinds DataKinds DeriveFunctor FlexibleContexts FlexibleInstances FunctionalDependencies GADTs LambdaCase MultiParamTypeClasses RankNTypes ScopedTypeVariables TypeApplications TypeOperators
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
-  build-depends:
-      base >=4.9 && <5
-    , freer-simple
-  default-language: Haskell2010
+    Capitalize
+    Console
+    Coroutine
+    Fresh
+    Trace
 
-test-suite unit
+  build-depends: freer-simple
+
+test-suite freer-simple-test
+  import: common
   type: exitcode-stdio-1.0
+  hs-source-dirs: tests
   main-is: Tests.hs
   other-modules:
-      Tests.Coroutine
-      Tests.Exception
-      Tests.Fresh
-      Tests.Loop
-      Tests.NonDet
-      Tests.Reader
-      Tests.State
-      Tests.TH
-      Paths_freer_simple
-  hs-source-dirs:
-      tests
-  default-extensions: ConstraintKinds DataKinds DeriveFunctor FlexibleContexts FlexibleInstances FunctionalDependencies GADTs LambdaCase MultiParamTypeClasses RankNTypes ScopedTypeVariables TypeApplications TypeOperators
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
+    Tests.Coroutine
+    Tests.Exception
+    Tests.Fresh
+    Tests.Loop
+    Tests.NonDet
+    Tests.Reader
+    Tests.State
+    Tests.TH
+
   build-depends:
-      QuickCheck
-    , base >=4.9 && <5
+    , QuickCheck
     , freer-simple
     , tasty
     , tasty-hunit
     , tasty-quickcheck
-  default-language: Haskell2010
 
-benchmark core
+benchmark freer-simple-bench
+  import: common
   type: exitcode-stdio-1.0
+  hs-source-dirs: bench
   main-is: Core.hs
-  other-modules:
-      Paths_freer_simple
-  hs-source-dirs:
-      bench
-  default-extensions: ConstraintKinds DataKinds DeriveFunctor FlexibleContexts FlexibleInstances FunctionalDependencies GADTs LambdaCase MultiParamTypeClasses RankNTypes ScopedTypeVariables TypeApplications TypeOperators
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -O2
+  ghc-options: -O2
+
   build-depends:
-      base >=4.9 && <5
     , criterion
     , extensible-effects
     , free
     , freer-simple
     , mtl
-  default-language: Haskell2010
diff --git a/src/Control/Monad/Freer/Internal.hs b/src/Control/Monad/Freer/Internal.hs
--- a/src/Control/Monad/Freer/Internal.hs
+++ b/src/Control/Monad/Freer/Internal.hs
@@ -84,7 +84,7 @@
 type Arr effs a b = a -> Eff effs b
 
 -- | An effectful function from @a :: *@ to @b :: *@ that is a composition of
--- several effectful functions. The paremeter @eff :: [* -> *]@ describes the
+-- several effectful functions. The paremeter @effs :: [* -> *]@ describes the
 -- overall effect. The composition members are accumulated in a type-aligned
 -- queue.
 type Arrs effs a b = FTCQueue (Eff effs) a b
diff --git a/src/Control/Monad/Freer/TH.hs b/src/Control/Monad/Freer/TH.hs
--- a/src/Control/Monad/Freer/TH.hs
+++ b/src/Control/Monad/Freer/TH.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell #-}
 
@@ -121,7 +122,11 @@
     resultType       = ConT ''Eff `AppT` VarT effs `AppT` tRet
 
   return
+#if MIN_VERSION_template_haskell(2,17,0)
+    .  ForallT [PlainTV effs SpecifiedSpec] [memberConstraint]
+#else
     .  ForallT [PlainTV effs] [memberConstraint]
+#endif
     .  foldArrows
     $  tArgs
     ++ [resultType]
@@ -141,8 +146,13 @@
 
 -- | Turn TvVarBndrs of the form (KindedTV tv StarT) into (PlainTV tv)
 -- This can prevent the need for KindSignatures
+#if MIN_VERSION_template_haskell(2,17,0)
+simplifyBndr :: TyVarBndrSpec -> TyVarBndrSpec
+simplifyBndr (KindedTV tv f StarT) = PlainTV tv f
+#else
 simplifyBndr :: TyVarBndr -> TyVarBndr
 simplifyBndr (KindedTV tv StarT) = PlainTV tv
+#endif
 simplifyBndr bndr = bndr
 
 -- | Generates a type signature of the form
