diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # Revision history for monad-control-identity
 
+## 0.1.1.1 -- 2022-03-31
+
+* Add base version boundary.
+
+## 0.1.1.0 -- 2022-03-31
+
+* Remove version boundaries for all dependencies.
+* Use DerivingVia internally to generate base instances for `MonadBaseControlIdentity`.
+
 ## 0.1.0.3 -- 2020-07-28
 
 * Accept older versions of transformers.
diff --git a/monad-control-identity.cabal b/monad-control-identity.cabal
--- a/monad-control-identity.cabal
+++ b/monad-control-identity.cabal
@@ -1,9 +1,10 @@
 name:                monad-control-identity
-version:             0.1.0.3
+version:             0.1.1.1
 synopsis:            Stronger classes than monad-control
-description:         This package defines the type class MonadBaseControlIdentity, which is very
-                     similar to MonadBaseControl from monad-control.
-                     The difference is, that MonadBaseControlIdentity instances are only valid,
+description:         This package defines the type class 'MonadBaseControlIdentity', which is very
+                     similar to 'MonadBaseControl' from
+                     <https://hackage.haskell.org/package/monad-control monad-control>.
+                     The difference is, that 'MonadBaseControlIdentity' instances are only valid,
                      when there is no monadic state.
                      This results in simpler type signatures to lift values in contravariant
                      positions.
@@ -21,10 +22,11 @@
 library
   exposed-modules:     Control.Monad.Trans.Control.Functor
                        Control.Monad.Trans.Control.Identity
-  build-depends:       base              >= 4.5     && < 5
-                     , monad-control     >= 1.0.2.3 && < 1.1
-                     , transformers      >= 0.5.5.0 && < 0.6
-                     , transformers-base >= 0.4.5.2 && < 0.5
+  build-depends:       base < 5
+                     , monad-control
+                     , transformers
+                     , transformers-base
+                     , stm
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options:         -Wall
diff --git a/src/Control/Monad/Trans/Control/Identity.hs b/src/Control/Monad/Trans/Control/Identity.hs
--- a/src/Control/Monad/Trans/Control/Identity.hs
+++ b/src/Control/Monad/Trans/Control/Identity.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances, FunctionalDependencies, TypeFamilies, Rank2Types, UndecidableInstances #-}
+{-# LANGUAGE DerivingVia, FlexibleInstances, FunctionalDependencies, GeneralizedNewtypeDeriving, StandaloneDeriving, TypeFamilies, Rank2Types, UndecidableInstances #-}
 
 module Control.Monad.Trans.Control.Identity (
 
@@ -9,7 +9,7 @@
 
 @
 newtype ExampleT = ...
-  deriving ('Monad', 'MonadTrans')
+  deriving ('Monad', 'Control.Monad.Trans.Class.MonadTrans')
 
 instance 'MonadTransControl' ExampleT where
   ...
@@ -21,8 +21,8 @@
 , defaultLiftWithIdentity
 
 -- * MonadBaseControlIdentity
--- | Regarding the 'IO' base monad this can be seen as an alternative
--- way to implement 'MonadUnliftIO'.
+-- | Regarding the 'IO' base monad this can be seen as an alternative,
+-- but equivalent, way to implement 'MonadUnliftIO'.
 , MonadBaseControlIdentity (..)
 {- | Just like 'MonadTransControlIdentity', 'MonadBaseControlIdentity'
   instances can easily be created for monad transformers:
@@ -36,9 +36,14 @@
 
 ) where
 
+import Control.Monad.Base
+import Control.Monad.ST.Lazy as L
+import Control.Monad.ST.Strict as S
+import Control.Monad.STM
 import Control.Monad.Trans.Control
 import Control.Monad.Trans.Identity
 import Control.Monad.Trans.Reader
+import Data.Functor.Identity
 
 {- | The 'MonadTransControlIdentity' type class is a stronger version of
   'MonadTransControl':
@@ -87,11 +92,32 @@
   liftBaseWithIdentity $ \ runIdInBase ->
     inner $ runIdInBase . runId
 
-instance MonadBaseControl b b => MonadBaseControlIdentity b b where
-  liftBaseWithIdentity inner = inner id
-
 instance MonadBaseControlIdentity b m => MonadBaseControlIdentity b (IdentityT m) where
   liftBaseWithIdentity = defaultLiftBaseWithIdentity
 
 instance MonadBaseControlIdentity b m => MonadBaseControlIdentity b (ReaderT r m) where
   liftBaseWithIdentity = defaultLiftBaseWithIdentity
+
+deriving via Base IO instance MonadBaseControlIdentity IO IO
+deriving via Base Maybe instance MonadBaseControlIdentity Maybe Maybe
+deriving via Base (Either e) instance MonadBaseControlIdentity (Either e) (Either e)
+deriving via Base [] instance MonadBaseControlIdentity [] []
+deriving via Base ((->) r) instance MonadBaseControlIdentity ((->) r) ((->) r)
+deriving via Base Identity instance MonadBaseControlIdentity Identity Identity
+deriving via Base STM instance MonadBaseControlIdentity STM STM
+deriving via Base (S.ST s) instance MonadBaseControlIdentity (S.ST s) (S.ST s)
+deriving via Base (L.ST s) instance MonadBaseControlIdentity (L.ST s) (L.ST s)
+
+newtype Base m a = MkBase { getBase :: m a }
+  deriving newtype (Functor, Applicative, Monad)
+
+instance Monad m => MonadBase m (Base m) where
+  liftBase = MkBase
+
+instance Monad m => MonadBaseControl m (Base m) where
+  type StM (Base m) a = a
+  liftBaseWith inner = MkBase $ inner getBase
+  restoreM = return
+
+instance Monad m => MonadBaseControlIdentity m (Base m) where
+  liftBaseWithIdentity inner = MkBase $ inner getBase
