diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+0.10.10 [2025.06.17]
+--------------------
+* Replace `test-framework` with `tasty` in the test suite.
+
 0.10.9 [2024.10.31]
 -------------------
 * Drop support for pre-8.0 versions of GHC.
diff --git a/exceptions.cabal b/exceptions.cabal
--- a/exceptions.cabal
+++ b/exceptions.cabal
@@ -1,6 +1,6 @@
 name:          exceptions
 category:      Control, Exceptions, Monad
-version:       0.10.9
+version:       0.10.10
 cabal-version: >= 1.10
 license:       BSD3
 license-file:  LICENSE
@@ -22,8 +22,9 @@
              , GHC == 9.2.8
              , GHC == 9.4.8
              , GHC == 9.6.6
-             , GHC == 9.8.2
+             , GHC == 9.8.4
              , GHC == 9.10.1
+             , GHC == 9.12.1
 synopsis:      Extensible optionally-pure exceptions
 description:   Extensible optionally-pure exceptions.
 
@@ -44,7 +45,7 @@
     base                       >= 4.9      && < 5,
     mtl                        >= 2.2      && < 2.4,
     stm                        >= 2.2      && < 3,
-    template-haskell           >= 2.11     && < 2.23,
+    template-haskell           >= 2.11     && < 2.25,
     transformers               >= 0.5.2.0  && < 0.7
 
   exposed-modules:
@@ -68,8 +69,8 @@
     mtl,
     stm,
     template-haskell,
-    transformers               >= 0.5.2.0  && < 0.7,
-    test-framework             >= 0.8      && < 0.9,
-    test-framework-hunit       >= 0.3      && < 0.4,
-    test-framework-quickcheck2 >= 0.3      && < 0.4,
-    QuickCheck                 >= 2.5      && < 2.16
+    transformers     >= 0.5.2.0 && < 0.7,
+    tasty            >= 1.4     && < 1.6,
+    tasty-hunit      >= 0.10    && < 0.11,
+    tasty-quickcheck >= 0.10    && < 0.12,
+    QuickCheck       >= 2.5     && < 2.17
diff --git a/tests/Control/Monad/Catch/Tests.hs b/tests/Control/Monad/Catch/Tests.hs
--- a/tests/Control/Monad/Catch/Tests.hs
+++ b/tests/Control/Monad/Catch/Tests.hs
@@ -21,11 +21,11 @@
 import Control.Monad.Trans.Except (ExceptT(..), runExceptT)
 import Control.Monad.STM (STM, atomically)
 --import Control.Monad.Cont (ContT(..))
-import Test.Framework (Test, testGroup)
-import Test.Framework.Providers.HUnit (testCase)
-import Test.Framework.Providers.QuickCheck2 (testProperty)
 import Test.QuickCheck (Property, ioProperty, once)
 import Test.QuickCheck.Monadic (monadic, run, assert)
+import Test.Tasty (TestTree, testGroup)
+import Test.Tasty.HUnit (testCase)
+import Test.Tasty.QuickCheck (testProperty)
 import qualified Control.Monad.State.Lazy as LazyState
 import qualified Control.Monad.State.Strict as StrictState
 import qualified Control.Monad.Writer.Lazy as LazyWriter
@@ -89,7 +89,7 @@
           detector
         assert effectWasPerformed
 
-tests :: Test
+tests :: TestTree
 tests = testGroup "Control.Monad.Catch.Tests" $
    ([ mkMonadCatch
     , mkCatchJust
@@ -230,11 +230,11 @@
     mkCatchJust = mkMSpecTest "catchJust" testCatchJust
     mkDetectableEffect = mkDetectableEffectTest "effect during release" testDetectableEffect
 
-    mkMSpecTest :: String -> (SomeMSpec -> Property) -> SomeMSpec -> Test
+    mkMSpecTest :: String -> (SomeMSpec -> Property) -> SomeMSpec -> TestTree
     mkMSpecTest name test = \someMSpec@(SomeMSpec spec) ->
         testProperty (name ++ " " ++ mspecName spec) $ once $ test someMSpec
 
-    mkDetectableEffectTest :: String -> (SomeDetectableEffect -> Property) -> SomeDetectableEffect -> Test
+    mkDetectableEffectTest :: String -> (SomeDetectableEffect -> Property) -> SomeDetectableEffect -> TestTree
     mkDetectableEffectTest name test = \someDetectableEffect@(SomeDetectableEffect detectableEffect) ->
         let testName = name ++ " " ++ mspecName (detectableEffectMSpec detectableEffect)
         in testProperty testName $ once $ test someDetectableEffect
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -1,10 +1,11 @@
 module Main where
 
-import Test.Framework (defaultMain)
+import Test.Tasty (defaultMain, testGroup)
 
 import qualified Control.Monad.Catch.Tests
 
 main :: IO ()
-main = defaultMain
+main = defaultMain $
+  testGroup "exceptions"
     [ Control.Monad.Catch.Tests.tests
     ]
