diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
 .ghc.environment.*
 .ghcid
-.stack-work/
-dist/
 dist-newstyle/
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,8 @@
 # Changelog
 
-All notable changes to this project will be documented in this file.
+## [1.2.0.1] - 2022-05-14
 
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/).
+- Support hspec-2.10.0
 
 ## [1.2] - 2021-05-28
 
@@ -11,54 +10,41 @@
 
 ## [1.1.7] - 2021-05-12
 
-### Changed
 - Support hspec-2.8.0
-
-### Removed
-- Don't re-export `Test.Hspec`
+- Remove re-export of `Test.Hspec`
 - Drop support for hspec < 2.5
 
 ## [1.1.6-r1] - 2021-03-13
 
-### Changed
 - Support base-4.15
 
 ## [1.1.6] - 2020-11-11
 
-### Changed
 - Rename `Success`/`Failure` to `TreatPendingAsSuccess`/`TreatPendingAsFailure`
 - Support tasty-1.4
 
 ## [1.1.5.1] - 2018-11-15
 
-### Changed
 - Support hspec-2.6.0
 
 ## [1.1.5] - 2018-06-27
 
-### Added
-- `TreatPendingAs` option, for allowing pending tests to be treated as successes
+- Add `TreatPendingAs` option, for allowing pending tests to be treated as successes
 
 ## [1.1.4] - 2018-3-18
 
-### Changed
 - Support hspec-2.5.0
-
-### Removed
-- Re-exports of QuickCheck and SmallCheck options
+- Remove re-exports of QuickCheck and SmallCheck options
 
 ## [1.1.3.3] - 2018-1-26
 
-### Removed
-- Redundant `random` dependency
+- Remove redundant `random` dependency
 
 ## [1.1.3.2] - 2017-6-20
 
-### Changed
 - Support tasty-0.9.1
 - More accurate dependency version bounds
 
 ## [1.1.3.1] - 2017-1-25
 
-### Changed
 - Support hspec-2.4.0
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013, Mitchell Rosen
+Copyright (c) 2013-2022, Mitchell Rosen
 
 All rights reserved.
 
diff --git a/cabal.project b/cabal.project
deleted file mode 100644
--- a/cabal.project
+++ /dev/null
@@ -1,3 +0,0 @@
-packages: .
-
-optimization: False
diff --git a/src/Test/Tasty/Hspec.hs b/src/Test/Tasty/Hspec.hs
--- a/src/Test/Tasty/Hspec.hs
+++ b/src/Test/Tasty/Hspec.hs
@@ -22,15 +22,15 @@
 import Data.Maybe (catMaybes, fromMaybe, mapMaybe)
 import Data.Proxy
 import Data.Typeable (Typeable)
-import qualified Test.Hspec as H
-import qualified Test.Hspec.Core.Formatters as H
-import qualified Test.Hspec.Core.Spec as H
-import qualified Test.Tasty as T
+import qualified Test.Hspec as Hspec
+import qualified Test.Hspec.Core.Formatters as Hspec.Core.Formatters
+import qualified Test.Hspec.Core.Spec as Hspec.Core.Spec
+import qualified Test.Tasty as Tasty
 import Test.Tasty.Hspec.Compat
-import qualified Test.Tasty.Options as T
-import qualified Test.Tasty.Providers as T
+import qualified Test.Tasty.Options as Tasty.Options
+import qualified Test.Tasty.Providers as Tasty.Providers
 import qualified Test.Tasty.QuickCheck as TQC
-import qualified Test.Tasty.Runners as T
+import qualified Test.Tasty.Runners as Tasty.Runners
 import qualified Test.Tasty.SmallCheck as TSC
 
 -- $examples
@@ -75,86 +75,83 @@
 
 -- | Create a <https://hackage.haskell.org/package/tasty tasty> 'T.TestTree' from an
 -- <https://hackage.haskell.org/package/hspec hspec> 'H.Spec'.
-testSpec :: T.TestName -> H.Spec -> IO T.TestTree
+testSpec :: Tasty.TestName -> Hspec.Spec -> IO Tasty.TestTree
 testSpec name spec = do
   trees <- testSpecs spec
-  pure (T.testGroup name trees)
+  pure (Tasty.testGroup name trees)
 
 -- | Create a list of <https://hackage.haskell.org/package/tasty tasty> 'T.TestTree' from an
 -- <https://hackage.haskell.org/package/hspec hspec> 'H.Spec'. This returns the same tests as 'testSpec'
 -- but doesn't create a <https://hackage.haskell.org/package/tasty tasty> test group from them.
-testSpecs :: H.Spec -> IO [T.TestTree]
+testSpecs :: Hspec.Spec -> IO [Tasty.TestTree]
 testSpecs spec = do
   -- Here we do as hspec does, which is pre-process a spec by focusing the whole thing, which is a no-op if
   -- anything inside is already focused, but otherwise focuses every item. Then, when creating a tasty test tree,
   -- we just toss the unfocused items.
-  trees <- H.runSpecM (focus spec)
+  trees <- runSpecM (focus spec)
   pure (mapMaybe specTreeToTestTree trees)
 
-specTreeToTestTree :: H.SpecTree () -> Maybe T.TestTree
+specTreeToTestTree :: Hspec.Core.Spec.SpecTree () -> Maybe Tasty.TestTree
 specTreeToTestTree = \case
-  Node name trees -> pure (T.testGroup name (mapMaybe specTreeToTestTree trees))
+  Node name trees -> pure (Tasty.testGroup name (mapMaybe specTreeToTestTree trees))
   NodeWithCleanup cleanup trees -> do
-    tree <- specTreeToTestTree (H.Node "(unnamed)" trees)
-    pure (T.WithResource (T.ResourceSpec (return ()) cleanup) (const tree))
+    tree <- specTreeToTestTree (Node "(unnamed)" trees)
+    pure (Tasty.Runners.WithResource (Tasty.Runners.ResourceSpec (pure ()) (twiddleCleanup cleanup)) (const tree))
   Leaf item -> do
     guard (itemIsFocused item)
-    pure (T.singleTest (H.itemRequirement item) (Item item))
+    pure (Tasty.Providers.singleTest (Hspec.Core.Spec.itemRequirement item) (Item item))
 
 newtype Item
-  = Item (H.Item ())
+  = Item (Hspec.Core.Spec.Item ())
   deriving (Typeable)
 
-instance T.IsTest Item where
+instance Tasty.Providers.IsTest Item where
   run opts (Item item) progress = do
     qcArgs <- optionSetToQuickCheckArgs opts
-    H.Result _ result <- itemExample item (params qcArgs) ($ ()) progress'
+    let params =
+          Hspec.Core.Spec.Params
+            { Hspec.Core.Spec.paramsQuickCheckArgs = qcArgs,
+              Hspec.Core.Spec.paramsSmallCheckDepth = optionSetToSmallCheckDepth opts
+            }
+    Hspec.Core.Spec.Result _ result <- itemExample item params ($ ()) progress'
     pure
       ( case result of
-          H.Success -> T.testPassed ""
-          H.Pending _ reason ->
-            case T.lookupOption opts of
-              TreatPendingAsFailure -> T.testFailed reason'
-              TreatPendingAsSuccess -> T.testPassed reason'
+          Hspec.Core.Spec.Success -> Tasty.Providers.testPassed ""
+          Hspec.Core.Spec.Pending _ reason ->
+            case Tasty.Options.lookupOption opts of
+              TreatPendingAsFailure -> Tasty.Providers.testFailed reason'
+              TreatPendingAsSuccess -> Tasty.Providers.testPassed reason'
             where
               reason' = "# PENDING: " ++ fromMaybe "No reason given" reason
-          H.Failure _ reason ->
+          Hspec.Core.Spec.Failure _ reason ->
             case reason of
-              H.NoReason -> T.testFailed ""
-              H.Reason x -> T.testFailed x
-              H.ExpectedButGot preface expected actual ->
-                T.testFailed . unlines . catMaybes $
+              Hspec.Core.Spec.NoReason -> Tasty.Providers.testFailed ""
+              Hspec.Core.Spec.Reason x -> Tasty.Providers.testFailed x
+              Hspec.Core.Spec.ExpectedButGot preface expected actual ->
+                Tasty.Providers.testFailed . unlines . catMaybes $
                   [ preface,
                     Just ("expected: " ++ expected),
                     Just (" but got: " ++ actual)
                   ]
-              H.Error _ exception -> T.testFailed ("uncaught exception: " ++ H.formatException exception)
+              Hspec.Core.Spec.Error _ exception ->
+                Tasty.Providers.testFailed ("uncaught exception: " ++ Hspec.Core.Formatters.formatException exception)
       )
     where
-      params qcArgs =
-        H.Params
-          { H.paramsQuickCheckArgs = qcArgs,
-            H.paramsSmallCheckDepth =
-              case T.lookupOption opts of
-                TSC.SmallCheckDepth depth ->
-                  depth
-          }
-
       progress' (x, y) =
         progress
-          T.Progress
-            { T.progressText = "",
-              T.progressPercent = fromIntegral x / fromIntegral y
+          Tasty.Runners.Progress
+            { Tasty.Runners.progressText = "",
+              Tasty.Runners.progressPercent = fromIntegral x / fromIntegral y
             }
 
   testOptions =
     pure
-      [ T.Option (Proxy :: Proxy TreatPendingAs),
-        T.Option (Proxy :: Proxy TQC.QuickCheckTests),
-        T.Option (Proxy :: Proxy TQC.QuickCheckReplay),
-        T.Option (Proxy :: Proxy TQC.QuickCheckMaxSize),
-        T.Option (Proxy :: Proxy TQC.QuickCheckMaxRatio),
-        T.Option (Proxy :: Proxy TSC.SmallCheckDepth)
+      [ Tasty.Options.Option (Proxy :: Proxy TreatPendingAs),
+        Tasty.Options.Option (Proxy :: Proxy TQC.QuickCheckTests),
+        Tasty.Options.Option (Proxy :: Proxy TQC.QuickCheckReplay),
+        Tasty.Options.Option (Proxy :: Proxy TQC.QuickCheckMaxSize),
+        Tasty.Options.Option (Proxy :: Proxy TQC.QuickCheckMaxRatio),
+        Tasty.Options.Option (Proxy :: Proxy TSC.SmallCheckDepth)
       ]
 
 -- | How to treat @hspec@ pending tests.
@@ -168,7 +165,7 @@
     TreatPendingAsFailure
   | TreatPendingAsSuccess
 
-instance T.IsOption TreatPendingAs where
+instance Tasty.Options.IsOption TreatPendingAs where
   defaultValue =
     TreatPendingAsFailure
 
diff --git a/src/Test/Tasty/Hspec/Compat.hs b/src/Test/Tasty/Hspec/Compat.hs
--- a/src/Test/Tasty/Hspec/Compat.hs
+++ b/src/Test/Tasty/Hspec/Compat.hs
@@ -5,6 +5,9 @@
     itemIsFocused,
     focus,
     optionSetToQuickCheckArgs,
+    optionSetToSmallCheckDepth,
+    runSpecM,
+    twiddleCleanup,
 
     pattern Leaf,
     pattern Node,
@@ -17,6 +20,11 @@
 import qualified Test.QuickCheck as QuickCheck
 import qualified Test.Tasty.Options as Tasty
 import qualified Test.Tasty.QuickCheck as Tasty.QuickCheck
+import qualified Test.Tasty.SmallCheck as Tasty.SmallCheck
+#if MIN_VERSION_hspec_core(2,10,0)
+import Data.Monoid (Endo)
+import qualified Test.Hspec.Core.Runner as Hspec.Core.Runner
+#endif
 
 {-# COMPLETE Leaf, Node, NodeWithCleanup #-}
 
@@ -25,7 +33,7 @@
   Hspec.Leaf item
 
 pattern Node :: String -> [Hspec.Tree c a] -> Hspec.Tree c a
-pattern Node name trees <-
+pattern Node name trees =
   Hspec.Node name trees
 
 pattern NodeWithCleanup :: c -> [Hspec.Tree c a] -> Hspec.Tree c a
@@ -81,3 +89,47 @@
     Tasty.QuickCheck.QuickCheckMaxRatio max_ratio = T.lookupOption opts
 #endif
 
+-- In hspec-core-2.10.0, Int changed to Maybe Int
+optionSetToSmallCheckDepth ::
+  Tasty.OptionSet ->
+#if MIN_VERSION_hspec_core(2,10,0)
+  Maybe
+#endif
+  Int
+optionSetToSmallCheckDepth opts =
+  case Tasty.lookupOption opts of
+    Tasty.SmallCheck.SmallCheckDepth depth ->
+#if MIN_VERSION_hspec_core(2,10,0)
+      Just
+#endif
+      depth
+
+-- In hspec-core-2.10.0, runSpecM started returning an Endo Config, which we don't need. (Right? :shrug:)
+runSpecM :: Hspec.SpecWith a -> IO [Hspec.SpecTree a]
+runSpecM spec = do
+#if MIN_VERSION_hspec_core(2,10,0)
+  (_ :: Endo Hspec.Core.Runner.Config, trees) <- Hspec.runSpecM spec
+  pure trees
+#else
+  Hspec.runSpecM spec
+#endif
+
+-- In hspec-core-2.10.0, the spec SpecTree type alias changed from
+--
+--   type SpecTree a = Tree (a -> IO ()) (Item a)
+--
+-- to
+--
+--   type SpecTree a = Tree (IO ()) (Item a)
+--
+-- So we have a function that "twiddles" the cleanup action (at monomorphic type `SpecTree ()`), which always returns a
+-- value of type `() -> IO ()`
+#if MIN_VERSION_hspec_core(2,10,0)
+twiddleCleanup :: IO () -> () -> IO ()
+twiddleCleanup =
+  const
+#else
+twiddleCleanup :: (() -> IO ()) -> () -> IO ()
+twiddleCleanup =
+  id
+#endif
diff --git a/tasty-hspec.cabal b/tasty-hspec.cabal
--- a/tasty-hspec.cabal
+++ b/tasty-hspec.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.0
 name:                tasty-hspec
-version:             1.2
+version:             1.2.0.1
 synopsis:            Hspec support for the Tasty test framework.
 description:         This package provides a Tasty provider for Hspec test
                      suites.
@@ -13,9 +13,10 @@
 category:            Testing
 build-type:          Simple
 
+tested-with: GHC == 8.10.7, GHC == 9.0.2, GHC == 9.2.2
+
 extra-source-files:
   .gitignore
-  cabal.project
   CHANGELOG.md
   examples/example.hs
   README.md
@@ -26,19 +27,20 @@
 
 library
   build-depends:
-    base ^>= 4.9 || ^>= 4.10 || ^>= 4.11 || ^>= 4.12 || ^>= 4.13 || ^>= 4.14 || ^>= 4.15,
-    hspec >= 2.5 && < 2.9,
-    hspec-core >= 2.5 && < 2.9,
+    base ^>= 4.9 || ^>= 4.10 || ^>= 4.11 || ^>= 4.12 || ^>= 4.13 || ^>= 4.14 || ^>= 4.15 || ^>= 4.16,
+    hspec ^>= 2.5 || ^>= 2.6 || ^>= 2.7 || ^>= 2.8 || ^>= 2.9 || ^>= 2.10,
+    hspec-core ^>= 2.5 || ^>= 2.6 || ^>= 2.7 || ^>= 2.8 || ^>= 2.9 || ^>= 2.10,
     QuickCheck ^>= 2.7 || ^>= 2.8 || ^>= 2.9 || ^>= 2.10 || ^>= 2.11 || ^>= 2.12 || ^>= 2.13 || ^>= 2.14,
     tasty ^>= 0.8 || ^>= 0.9 || ^>= 0.10 || ^>= 0.11 || ^>= 0.12 || ^>= 1.0 || ^>= 1.1 || ^>= 1.2 || ^>= 1.3 || ^>= 1.4,
     tasty-smallcheck >= 0.1 && < 0.9,
     -- 0.9 is missing 'optionSetToArgs'
     tasty-quickcheck >=0.3 && <0.9 || ^>=0.9.1 || ^>= 0.10
   if impl(ghc < 7.8)
-    build-depends:     tagged >= 0.2
+    build-depends: tagged >= 0.2
   default-extensions:
     LambdaCase
     PatternSynonyms
+    ScopedTypeVariables
   default-language: Haskell2010
   exposed-modules: Test.Tasty.Hspec
   ghc-options: -Wall
