diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,18 @@
 Changes
 =======
 
+Version 1.4.2.3
+---------------
+
+_2022-05-10_
+
+- Drop `mtl` dependency
+- Warning-free under GHC 8.0 - 9.2
+
 Version 1.4.2.2
 ---------------
+
+_2022-05-10_
 
 - Fix compilation with `mtl-2.3`
 - Tested with GHC 8.0 - 9.2; dropped support for GHC 7.x
diff --git a/Test/Tasty/Ingredients/ConsoleReporter.hs b/Test/Tasty/Ingredients/ConsoleReporter.hs
--- a/Test/Tasty/Ingredients/ConsoleReporter.hs
+++ b/Test/Tasty/Ingredients/ConsoleReporter.hs
@@ -29,8 +29,8 @@
 import Prelude hiding (fail, EQ)
 import Control.Monad (join, unless, void, when, (<=<))
 import Control.Monad.IO.Class (liftIO)
-import Control.Monad.Reader (Reader, runReader, ask)
-import Control.Monad.State (evalState, evalStateT, get, modify, put)
+import Control.Monad.Trans.Reader (Reader, runReader, ask)
+import Control.Monad.Trans.State (evalState, evalStateT, get, modify, put)
 import Control.Concurrent.STM
 import Control.Exception
 import Test.Tasty.Core
@@ -60,7 +60,6 @@
 import System.IO
 import System.Console.ANSI
 #if !MIN_VERSION_base(4,11,0)
-import Data.Monoid
 import Data.Foldable (foldMap)
 #endif
 
diff --git a/Test/Tasty/Patterns/Eval.hs b/Test/Tasty/Patterns/Eval.hs
--- a/Test/Tasty/Patterns/Eval.hs
+++ b/Test/Tasty/Patterns/Eval.hs
@@ -3,11 +3,11 @@
 
 import Prelude hiding (Ordering(..))
 import Control.Monad ((<=<))
-import Control.Monad.Reader (ReaderT, runReaderT, ask)
-import Control.Monad.Error.Class (throwError) -- see #201
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask)
 import qualified Data.Sequence as Seq
 import Data.Foldable
-import Data.List hiding (length)
+import Data.List (findIndex, intercalate, isInfixOf, isPrefixOf, tails)
 import Data.Maybe
 import Data.Char
 import Test.Tasty.Patterns.Types
@@ -27,6 +27,9 @@
   deriving Show
 
 type M = ReaderT Path (Either String)
+
+throwError :: String -> M a
+throwError s = lift $ Left s
 
 asS :: Value -> M String
 asS v = return $
diff --git a/Test/Tasty/Run.hs b/Test/Tasty/Run.hs
--- a/Test/Tasty/Run.hs
+++ b/Test/Tasty/Run.hs
@@ -16,8 +16,9 @@
 import Data.Typeable
 import Control.Monad (forever, guard, join, liftM)
 import Control.Monad.IO.Class (liftIO)
-import Control.Monad.Reader (ReaderT(..), local, ask)
-import Control.Monad.Writer (WriterT(..), execWriterT, tell)
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Reader (ReaderT(..), local, ask)
+import Control.Monad.Trans.Writer (WriterT(..), execWriterT, mapWriterT, tell)
 import Control.Concurrent
 import Control.Concurrent.STM
 import Control.Concurrent.Timeout (timeout)
@@ -244,9 +245,9 @@
           { foldSingle = runSingleTest
           , foldResource = addInitAndRelease
           , foldGroup = \_opts name (Traversal a) ->
-              Traversal $ local (first (Seq.|> name)) a
+              Traversal $ mapWriterT (local (first (Seq.|> name))) a
           , foldAfter = \_opts deptype pat (Traversal a) ->
-              Traversal $ local (second ((deptype, pat) :)) a
+              Traversal $ mapWriterT (local (second ((deptype, pat) :))) a
           }
         opts0 tree
   (tests, fins) <- unwrap (mempty :: Path) (mempty :: Deps) traversal
@@ -264,7 +265,7 @@
     runSingleTest :: IsTest t => OptionSet -> TestName -> t -> Tr
     runSingleTest opts name test = Traversal $ do
       statusVar <- liftIO $ atomically $ newTVar NotStarted
-      (parentPath, deps) <- ask
+      (parentPath, deps) <- lift ask
       let
         path = parentPath Seq.|> name
         act (inits, fins) =
@@ -279,7 +280,7 @@
       let
         ini = Initializer doInit initVar
         fin = Finalizer doRelease initVar finishVar
-        tests' = map (first $ local $ (Seq.|> ini) *** (fin Seq.<|)) tests
+        tests' = map (first (\f (x, y) -> f (x Seq.|> ini, fin Seq.<| y))) tests
       return (tests', fins Seq.|> fin)
     wrap
       :: (Path ->
diff --git a/Test/Tasty/Runners/Reducers.hs b/Test/Tasty/Runners/Reducers.hs
--- a/Test/Tasty/Runners/Reducers.hs
+++ b/Test/Tasty/Runners/Reducers.hs
@@ -44,9 +44,6 @@
 import Control.Applicative
 import Prelude  -- Silence AMP import warnings
 import qualified Data.Semigroup as Sem
-#if !MIN_VERSION_base(4,11,0)
-import Data.Monoid
-#endif
 
 -- | Monoid generated by '*>'
 newtype Traversal f = Traversal { getTraversal :: f () }
diff --git a/tasty.cabal b/tasty.cabal
--- a/tasty.cabal
+++ b/tasty.cabal
@@ -1,8 +1,6 @@
--- Initial tasty.cabal generated by cabal init.  For further documentation,
---  see http://haskell.org/cabal/users-guide/
-
+cabal-version:       >=1.10
 name:                tasty
-version:             1.4.2.2
+version:             1.4.2.3
 synopsis:            Modern and extensible testing framework
 description:         Tasty is a modern testing framework for Haskell.
                      It lets you combine your unit tests, golden
@@ -18,7 +16,6 @@
 category:            Testing
 build-type:          Simple
 extra-source-files:  CHANGELOG.md, README.md
-cabal-version:       >=1.10
 
 Source-repository head
   type:     git
@@ -65,22 +62,23 @@
     Test.Tasty.CmdLine,
     Test.Tasty.Ingredients.ListTests
     Test.Tasty.Ingredients.IncludingOptions
+
   build-depends:
-    base >= 4.9 && < 5,
-    stm >= 2.3,
+    base                 >= 4.9 && < 5,
+    stm                  >= 2.3,
     containers,
-    mtl >= 2.1.3.1,
-    tagged >= 0.5,
+    transformers         >= 0.5,
+    tagged               >= 0.5,
     optparse-applicative >= 0.14,
-    unbounded-delays >= 0.1,
-    ansi-terminal >= 0.9
+    unbounded-delays     >= 0.1,
+    ansi-terminal        >= 0.9
   if(!impl(ghc >= 8.0))
     build-depends: semigroups
 
   if flag(clock) && !impl(ghcjs)
     build-depends: clock >= 0.4.4.0
   else
-    build-depends: time >= 1.4
+    build-depends: time  >= 1.4
 
   if !os(windows) && !impl(ghcjs)
     build-depends: wcwidth
@@ -90,4 +88,7 @@
   -- hs-source-dirs:
   default-language:    Haskell2010
   default-extensions:  CPP, ScopedTypeVariables, DeriveDataTypeable
-  ghc-options: -Wall -Wno-incomplete-uni-patterns
+  ghc-options:
+    -Wall
+    -Wno-incomplete-uni-patterns
+    -Wcompat
