diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+1.4.3.0 [2024-12-08]
+--------------------
+* All transformers now instantiate:
+  * MonadFail
+  * MonadIO
+
 1.4.2.0 [2024-12-07]
 --------------------
 * Mini.Data.Set:
diff --git a/Mini/Data/Map.hs b/Mini/Data/Map.hs
--- a/Mini/Data/Map.hs
+++ b/Mini/Data/Map.hs
@@ -99,7 +99,6 @@
   max,
   maybe,
   mempty,
-  not,
   pure,
   show,
   traverse,
@@ -230,7 +229,7 @@
 
 -- | /O(m log n)/ Unite a map with another via left-biased key matching
 union :: (Ord k) => Map k a -> Map k a -> Map k a
-union t = foldrWithKey (\k a b -> bool b (insert k a b) . not $ k `member` t) t
+union t = foldrWithKey (\k a b -> bool (insert k a b) b $ k `member` t) t
 
 {-
  - Conversion
diff --git a/Mini/Transformers/EitherT.hs b/Mini/Transformers/EitherT.hs
--- a/Mini/Transformers/EitherT.hs
+++ b/Mini/Transformers/EitherT.hs
@@ -23,6 +23,10 @@
   liftM,
   (>=>),
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Mini.Transformers.Class (
   MonadTrans,
   lift,
@@ -35,8 +39,10 @@
   ),
   Functor,
   Monad,
+  MonadFail,
   Monoid,
   either,
+  fail,
   fmap,
   mappend,
   mempty,
@@ -84,6 +90,12 @@
 
 instance MonadTrans (EitherT e) where
   lift = EitherT . fmap Right
+
+instance (MonadFail m) => MonadFail (EitherT e m) where
+  fail = EitherT . fail
+
+instance (MonadIO m) => MonadIO (EitherT e m) where
+  liftIO = lift . liftIO
 
 {-
  - Operations
diff --git a/Mini/Transformers/MaybeT.hs b/Mini/Transformers/MaybeT.hs
--- a/Mini/Transformers/MaybeT.hs
+++ b/Mini/Transformers/MaybeT.hs
@@ -23,6 +23,10 @@
   liftM,
   (>=>),
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Mini.Transformers.Class (
   MonadTrans,
   lift,
@@ -35,6 +39,8 @@
     Nothing
   ),
   Monad,
+  MonadFail,
+  fail,
   fmap,
   maybe,
   pure,
@@ -81,6 +87,12 @@
 
 instance MonadTrans MaybeT where
   lift = MaybeT . fmap Just
+
+instance (Monad m) => MonadFail (MaybeT m) where
+  fail _ = empty
+
+instance (MonadIO m) => MonadIO (MaybeT m) where
+  liftIO = lift . liftIO
 
 {-
  - Operations
diff --git a/Mini/Transformers/ParserT.hs b/Mini/Transformers/ParserT.hs
--- a/Mini/Transformers/ParserT.hs
+++ b/Mini/Transformers/ParserT.hs
@@ -50,6 +50,10 @@
   liftM,
   (>=>),
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Data.Bool (
   bool,
  )
@@ -119,7 +123,7 @@
 
 -- | Parse @p@ or, if @p@ fails, backtrack and parse @q@ via @p \<|\> q@
 instance (Monad m, Eq s) => Alternative (ParserT s m) where
-  empty = ParserT . const . pure . Left $ ParseError empty
+  empty = fail empty
   m <|> n = ParserT $ \ss ->
     runParserT m ss
       >>= either
@@ -146,6 +150,9 @@
 
 instance (Monad m) => MonadFail (ParserT s m) where
   fail = ParserT . const . pure . Left . ParseError
+
+instance (MonadIO m) => MonadIO (ParserT s m) where
+  liftIO = lift . liftIO
 
 -- | A parse error
 newtype ParseError = ParseError {unexpected :: String}
diff --git a/Mini/Transformers/ReaderT.hs b/Mini/Transformers/ReaderT.hs
--- a/Mini/Transformers/ReaderT.hs
+++ b/Mini/Transformers/ReaderT.hs
@@ -22,6 +22,10 @@
   ap,
   liftM,
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Mini.Transformers.Class (
   MonadTrans,
   lift,
@@ -30,7 +34,9 @@
   Applicative,
   Functor,
   Monad,
+  MonadFail,
   const,
+  fail,
   fmap,
   pure,
   ($),
@@ -53,11 +59,11 @@
   fmap = liftM
 
 instance (Monad m) => Applicative (ReaderT r m) where
-  pure = ReaderT . const . pure
+  pure = lift . pure
   (<*>) = ap
 
 instance (Monad m, Alternative m) => Alternative (ReaderT r m) where
-  empty = ReaderT . const $ empty
+  empty = lift empty
   m <|> n = ReaderT $ \r -> runReaderT m r <|> runReaderT n r
 
 instance (Monad m) => Monad (ReaderT r m) where
@@ -65,6 +71,12 @@
 
 instance MonadTrans (ReaderT r) where
   lift = ReaderT . const
+
+instance (MonadFail m) => MonadFail (ReaderT r m) where
+  fail = lift . fail
+
+instance (MonadIO m) => MonadIO (ReaderT r m) where
+  liftIO = lift . liftIO
 
 {-
  - Operations
diff --git a/Mini/Transformers/StateT.hs b/Mini/Transformers/StateT.hs
--- a/Mini/Transformers/StateT.hs
+++ b/Mini/Transformers/StateT.hs
@@ -26,6 +26,10 @@
   liftM,
   (>=>),
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Mini.Transformers.Class (
   MonadTrans,
   lift,
@@ -34,7 +38,9 @@
   Applicative,
   Functor,
   Monad,
+  MonadFail,
   const,
+  fail,
   fmap,
   pure,
   ($),
@@ -70,6 +76,12 @@
 
 instance MonadTrans (StateT s) where
   lift m = StateT $ \s -> (,s) <$> m
+
+instance (MonadFail m) => MonadFail (StateT s m) where
+  fail = StateT . const . fail
+
+instance (MonadIO m) => MonadIO (StateT s m) where
+  liftIO = lift . liftIO
 
 {-
  - Operations
diff --git a/Mini/Transformers/WriterT.hs b/Mini/Transformers/WriterT.hs
--- a/Mini/Transformers/WriterT.hs
+++ b/Mini/Transformers/WriterT.hs
@@ -23,6 +23,10 @@
   ap,
   liftM,
  )
+import Control.Monad.IO.Class (
+  MonadIO,
+  liftIO,
+ )
 import Mini.Transformers.Class (
   MonadTrans,
   lift,
@@ -31,7 +35,9 @@
   Applicative,
   Functor,
   Monad,
+  MonadFail,
   Monoid,
+  fail,
   fmap,
   mempty,
   pure,
@@ -71,6 +77,12 @@
 
 instance (Monoid w) => MonadTrans (WriterT w) where
   lift = WriterT . fmap (,mempty)
+
+instance (MonadFail m, Monoid w) => MonadFail (WriterT w m) where
+  fail = WriterT . fail
+
+instance (MonadIO m, Monoid w) => MonadIO (WriterT w m) where
+  liftIO = lift . liftIO
 
 {-
  - Operations
diff --git a/mini.cabal b/mini.cabal
--- a/mini.cabal
+++ b/mini.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               mini
-version:            1.4.2.0
+version:            1.4.3.0
 license:            MIT
 license-file:       LICENSE
 author:             Victor Wallsten <victor.wallsten@protonmail.com>
