diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,10 @@
 # Changelog for [`multistate` package](https://hackage.haskell.org/package/multistate)
 
+## 0.8.0.4 *January 2022*
+
+  * Adapt for ghc-9.0 and ghc-9.2
+  * Clean up code a bit, fix compiler warnings (thanks sergv)
+
 ## 0.8.0.3 *May 2020*
 
   * Adapt for ghc-8.10
diff --git a/multistate.cabal b/multistate.cabal
--- a/multistate.cabal
+++ b/multistate.cabal
@@ -1,5 +1,5 @@
 Name:          multistate
-Version:       0.8.0.3
+Version:       0.8.0.4
 Cabal-Version: >= 1.10
 Build-Type:    Simple
 license:       BSD3
@@ -68,7 +68,7 @@
   other-modules:
     Control.Monad.Trans.MultiGST.Common
   build-depends:
-    base         >= 4.11  && <4.15,
+    base         >= 4.11  && <4.17,
     mtl          >= 2.1   && <2.3,
     transformers >= 0.3   && <0.6,
     tagged       >= 0.7   && <0.9,
@@ -79,6 +79,7 @@
     TypeFamilies
     MultiParamTypeClasses
     FunctionalDependencies
+    FlexibleContexts
     FlexibleInstances
     UndecidableInstances
     TypeOperators
@@ -103,7 +104,7 @@
     multistate,
     base <999,
     transformers <0.6,
-    hspec >=2 && <2.8
+    hspec >=2 && <2.9
   ghc-options:      -Wall
   main-is:          Test.hs
   hs-source-dirs:   test
diff --git a/src/Control/Monad/Trans/MultiGST/Common.hs b/src/Control/Monad/Trans/MultiGST/Common.hs
--- a/src/Control/Monad/Trans/MultiGST/Common.hs
+++ b/src/Control/Monad/Trans/MultiGST/Common.hs
@@ -1,9 +1,9 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE UndecidableSuperClasses #-}
 {-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 -- | Common definitions for MultiGST.Strict and MultiGST.Lazy
 module Control.Monad.Trans.MultiGST.Common
diff --git a/src/Control/Monad/Trans/MultiGST/Lazy.hs b/src/Control/Monad/Trans/MultiGST/Lazy.hs
--- a/src/Control/Monad/Trans/MultiGST/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiGST/Lazy.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE UndecidableSuperClasses #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 -- | Alternative multi-valued version of mtl's RWS / RWST. In contrast to
 -- @'MultiRWS'(T)@ this version only takes a single list of types as
diff --git a/src/Control/Monad/Trans/MultiGST/Strict.hs b/src/Control/Monad/Trans/MultiGST/Strict.hs
--- a/src/Control/Monad/Trans/MultiGST/Strict.hs
+++ b/src/Control/Monad/Trans/MultiGST/Strict.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE UndecidableSuperClasses #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 -- | Alternative multi-valued version of mtl's RWS / RWST. In contrast to
 -- @'MultiRWS'(T)@ this version only takes a single list of types as
diff --git a/src/Control/Monad/Trans/MultiRWS/Lazy.hs b/src/Control/Monad/Trans/MultiRWS/Lazy.hs
--- a/src/Control/Monad/Trans/MultiRWS/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiRWS/Lazy.hs
@@ -135,7 +135,7 @@
   (<*>) = ap
 
 instance (Monad m) => Monad (MultiRWST r w s m) where
-  return = MultiRWST . return
+  return = pure
   k >>= f = MultiRWST $ runMultiRWSTRaw k >>= runMultiRWSTRaw . f
 
 instance MonadTrans (MultiRWST r w s) where
diff --git a/src/Control/Monad/Trans/MultiRWS/Strict.hs b/src/Control/Monad/Trans/MultiRWS/Strict.hs
--- a/src/Control/Monad/Trans/MultiRWS/Strict.hs
+++ b/src/Control/Monad/Trans/MultiRWS/Strict.hs
@@ -136,7 +136,7 @@
   (<*>) = ap
 
 instance (Monad m) => Monad (MultiRWST r w s m) where
-  return = MultiRWST . return
+  return = pure
   k >>= f = MultiRWST $ runMultiRWSTRaw k >>= runMultiRWSTRaw . f
 
 instance MonadTrans (MultiRWST r w s) where
diff --git a/src/Control/Monad/Trans/MultiReader/Lazy.hs b/src/Control/Monad/Trans/MultiReader/Lazy.hs
--- a/src/Control/Monad/Trans/MultiReader/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiReader/Lazy.hs
@@ -76,23 +76,23 @@
 
 
 -- | A Reader transformer monad patameterized by:
---   
+--
 -- * x - The list of types constituting the environment / input (to be read),
 -- * m - The inner monad.
--- 
+--
 -- 'MultiReaderT' corresponds to mtl's 'ReaderT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiReaderT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a Reader transformer containing the types [Int, Bool].
 newtype MultiReaderT x m a = MultiReaderT {
   runMultiReaderTRaw :: StateT (HList x) m a
@@ -115,7 +115,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiReaderT x m) where
-  return = MultiReaderT . return
+  return = pure
   k >>= f = MultiReaderT $ runMultiReaderTRaw k >>= runMultiReaderTRaw . f
 
 instance MonadTrans (MultiReaderT x) where
@@ -209,7 +209,7 @@
     runMultiReaderTRaw
   pass = MultiReaderT .
     mapStateT (pass . liftM (\(~(~(a, f), w)) -> ((a, w), f))) .
-    runMultiReaderTRaw  
+    runMultiReaderTRaw
 
 instance MonadIO m => MonadIO (MultiReaderT c m) where
   liftIO = lift . liftIO
diff --git a/src/Control/Monad/Trans/MultiReader/Strict.hs b/src/Control/Monad/Trans/MultiReader/Strict.hs
--- a/src/Control/Monad/Trans/MultiReader/Strict.hs
+++ b/src/Control/Monad/Trans/MultiReader/Strict.hs
@@ -76,23 +76,23 @@
 
 
 -- | A Reader transformer monad patameterized by:
---   
+--
 -- * x - The list of types constituting the environment / input (to be read),
 -- * m - The inner monad.
--- 
+--
 -- 'MultiReaderT' corresponds to mtl's 'ReaderT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiReaderT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a Reader transformer containing the types [Int, Bool].
 newtype MultiReaderT x m a = MultiReaderT {
   runMultiReaderTRaw :: StateT (HList x) m a
@@ -115,7 +115,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiReaderT x m) where
-  return = MultiReaderT . return
+  return = pure
   k >>= f = MultiReaderT $ runMultiReaderTRaw k >>= (runMultiReaderTRaw . f)
 
 instance MonadTrans (MultiReaderT x) where
@@ -209,7 +209,7 @@
     runMultiReaderTRaw
   pass = MultiReaderT .
     mapStateT (pass . liftM (\((a, f), w) -> ((a, w), f))) .
-    runMultiReaderTRaw  
+    runMultiReaderTRaw
 
 instance MonadIO m => MonadIO (MultiReaderT c m) where
   liftIO = lift . liftIO
diff --git a/src/Control/Monad/Trans/MultiState/Lazy.hs b/src/Control/Monad/Trans/MultiState/Lazy.hs
--- a/src/Control/Monad/Trans/MultiState/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiState/Lazy.hs
@@ -92,23 +92,23 @@
 
 
 -- | A State transformer monad patameterized by:
---   
+--
 -- * x - The list of types constituting the state,
 -- * m - The inner monad.
--- 
+--
 -- 'MultiStateT' corresponds to mtl's 'StateT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiStateT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a State wrapper containing the types [Int, Bool].
 newtype MultiStateT x m a = MultiStateT {
   runMultiStateTRaw :: StateT (HList x) m a
@@ -132,7 +132,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiStateT x m) where
-  return = MultiStateT . return
+  return = pure
   k >>= f = MultiStateT $ runMultiStateTRaw k >>= (runMultiStateTRaw.f)
 
 instance MonadTrans (MultiStateT x) where
@@ -223,11 +223,11 @@
 withMultiStates = withMultiStatesAS
 withMultiStatesAS HNil       = liftM (\r -> (r, HNil))
 withMultiStatesAS (x :+: xs) = liftM (\(~(~(a, x'), xs')) -> (a, x' :+: xs'))
-                        . withMultiStatesAS xs 
+                        . withMultiStatesAS xs
                         . withMultiStateAS x
 withMultiStatesSA HNil       = liftM (\r -> (HNil, r))
 withMultiStatesSA (x :+: xs) = liftM (\(~(~(a, x'), xs')) -> (x' :+: xs', a))
-                        . withMultiStatesAS xs 
+                        . withMultiStatesAS xs
                         . withMultiStateAS x
 withMultiStatesA  HNil       = id
 withMultiStatesA  (x :+: xs) = withMultiStatesA xs . withMultiStateA x
@@ -282,7 +282,7 @@
     runMultiStateTRaw
   pass = MultiStateT .
     mapStateT (pass . liftM (\(~(~(a, f), w)) -> ((a, w), f))) .
-    runMultiStateTRaw  
+    runMultiStateTRaw
 
 instance MonadIO m => MonadIO (MultiStateT c m) where
   liftIO = lift . liftIO
diff --git a/src/Control/Monad/Trans/MultiState/Strict.hs b/src/Control/Monad/Trans/MultiState/Strict.hs
--- a/src/Control/Monad/Trans/MultiState/Strict.hs
+++ b/src/Control/Monad/Trans/MultiState/Strict.hs
@@ -92,23 +92,23 @@
 
 
 -- | A State transformer monad patameterized by:
---   
+--
 -- * x - The list of types constituting the state,
 -- * m - The inner monad.
--- 
+--
 -- 'MultiStateT' corresponds to mtl's 'StateT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiStateT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a State wrapper containing the types [Int, Bool].
 newtype MultiStateT x m a = MultiStateT {
   runMultiStateTRaw :: StateT (HList x) m a
@@ -130,7 +130,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiStateT x m) where
-  return = MultiStateT . return
+  return = pure
   k >>= f = MultiStateT $ runMultiStateTRaw k >>= (runMultiStateTRaw.f)
 
 instance MonadTrans (MultiStateT x) where
@@ -221,11 +221,11 @@
 withMultiStates = withMultiStatesAS
 withMultiStatesAS HNil       = liftM (\r -> (r, HNil))
 withMultiStatesAS (x :+: xs) = liftM (\((a, x'), xs') -> (a, x' :+: xs'))
-                        . withMultiStatesAS xs 
+                        . withMultiStatesAS xs
                         . withMultiStateAS x
 withMultiStatesSA HNil       = liftM (\r -> (HNil, r))
 withMultiStatesSA (x :+: xs) = liftM (\((a, x'), xs') -> (x' :+: xs', a))
-                        . withMultiStatesAS xs 
+                        . withMultiStatesAS xs
                         . withMultiStateAS x
 withMultiStatesA  HNil       = id
 withMultiStatesA  (x :+: xs) = withMultiStatesA xs . withMultiStateA x
@@ -280,7 +280,7 @@
     runMultiStateTRaw
   pass = MultiStateT .
     mapStateT (pass . liftM (\((a, f), w) -> ((a, w), f))) .
-    runMultiStateTRaw  
+    runMultiStateTRaw
 
 instance MonadIO m => MonadIO (MultiStateT c m) where
   liftIO = lift . liftIO
diff --git a/src/Control/Monad/Trans/MultiWriter/Lazy.hs b/src/Control/Monad/Trans/MultiWriter/Lazy.hs
--- a/src/Control/Monad/Trans/MultiWriter/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiWriter/Lazy.hs
@@ -85,23 +85,23 @@
 
 
 -- | A Writer transformer monad patameterized by:
---   
+--
 -- * x - The list of types that can be written (Monoid instances).
 -- * m - The inner monad.
--- 
+--
 -- 'MultiWriterT' corresponds to mtl's 'WriterT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiWriterT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a Writer transformer containing the types [Int, Bool].
 newtype MultiWriterT x m a = MultiWriterT {
   runMultiWriterTRaw :: StateT (HList x) m a
@@ -120,7 +120,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiWriterT x m) where
-  return = MultiWriterT . return
+  return = pure
   k >>= f = MultiWriterT $ runMultiWriterTRaw k >>= (runMultiWriterTRaw . f)
 
 instance MonadTrans (MultiWriterT x) where
diff --git a/src/Control/Monad/Trans/MultiWriter/Strict.hs b/src/Control/Monad/Trans/MultiWriter/Strict.hs
--- a/src/Control/Monad/Trans/MultiWriter/Strict.hs
+++ b/src/Control/Monad/Trans/MultiWriter/Strict.hs
@@ -85,23 +85,23 @@
 
 
 -- | A Writer transformer monad patameterized by:
---   
+--
 -- * x - The list of types that can be written (Monoid instances).
 -- * m - The inner monad.
--- 
+--
 -- 'MultiWriterT' corresponds to mtl's 'WriterT', but can contain
 -- a heterogenous list of types.
--- 
+--
 -- This heterogenous list is represented using Types.Data.List, i.e:
--- 
+--
 --   * @'[]@ - The empty list,
 --   * @a ': b@ - A list where @/a/@ is an arbitrary type
 --     and @/b/@ is the rest list.
--- 
+--
 -- For example,
--- 
+--
 -- > MultiWriterT '[Int, Bool] :: (* -> *) -> (* -> *)
--- 
+--
 -- is a Writer transformer containing the types [Int, Bool].
 newtype MultiWriterT x m a = MultiWriterT {
   runMultiWriterTRaw :: StateT (HList x) m a
@@ -120,7 +120,7 @@
   (<*>) = ap
 
 instance Monad m => Monad (MultiWriterT x m) where
-  return = MultiWriterT . return
+  return = pure
   k >>= f = MultiWriterT $ runMultiWriterTRaw k >>= (runMultiWriterTRaw.f)
 
 instance MonadTrans (MultiWriterT x) where
