diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for deriving-trans
 
+## 0.9.1.0 *12 Jul 2023*
+
+* Support new optional dependency monad-logger `>= 0.3.38`.
+* Add `MonadLogger` and `MonadLoggerIO` instances to `Elevator` and `ComposeT`.
+* Add `MonadLogger` and `MonadLoggerIO` "base-case" instances for `LoggingT`, `NoLoggingT` and `WriterLoggingT`.
+
 ## 0.9.0.0 *05 Jul 2023*
 
 * Drop support for `GHC < 9.6`.
diff --git a/deriving-trans.cabal b/deriving-trans.cabal
--- a/deriving-trans.cabal
+++ b/deriving-trans.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: deriving-trans
-version: 0.9.0.0
+version: 0.9.1.0
 synopsis: Derive instances for monad transformer stacks
 description:
   Implementing instances for monad transformer stacks can be tedious.
@@ -35,6 +35,11 @@
   description:
     Implement instances for `MonadLogic`.
 
+flag monad-logger
+  default: True
+  description:
+    Implement instances for `MonadLogger` and `MonadLoggerIO`.
+
 flag mtl
   default: True
   description:
@@ -79,6 +84,9 @@
   if flag(logict)
     build-depends:
       , logict >= 0.8.0.0
+  if flag(monad-logger)
+    build-depends:
+      , monad-logger >= 0.3.38
   if flag(mtl)
     other-modules:
       Control.Monad.Accum.OrphanInstances
diff --git a/src/Control/Monad/Trans/Compose.hs b/src/Control/Monad/Trans/Compose.hs
--- a/src/Control/Monad/Trans/Compose.hs
+++ b/src/Control/Monad/Trans/Compose.hs
@@ -29,6 +29,10 @@
 import Control.Monad.Logic.Class qualified as LogicT
 #endif
 
+#if defined(VERSION_monad_logger)
+import Control.Monad.Logger qualified as MonadLogger
+#endif
+
 #if defined(VERSION_mtl)
 import Control.Monad.Accum qualified as Mtl
 import Control.Monad.Accum.OrphanInstances qualified as Mtl ()
@@ -300,6 +304,63 @@
   instance
     ( Monad (t2 m)
     ) => LogicT.MonadLogic (ComposeT LogicT.T.LogicT t2 m)
+#endif
+
+#if defined(VERSION_monad_logger)
+-- | /OVERLAPPABLE/.
+-- Elevated to @(t2 m)@.
+deriving via Elevator t1 (t2 (m :: Type -> Type))
+  instance {-# OVERLAPPABLE #-}
+    ( MonadLogger.MonadLogger (t2 m)
+    , MonadTrans t1
+    ) => MonadLogger.MonadLogger (ComposeT t1 t2 m)
+
+-- | Set by 'MonadLogger.LoggingT'.
+deriving via MonadLogger.LoggingT (t2 (m :: Type -> Type))
+  instance
+    ( MonadIO (t2 m)
+    ) => MonadLogger.MonadLogger (ComposeT MonadLogger.LoggingT t2 m)
+
+-- | Set by 'MonadLogger.NoLoggingT'.
+deriving via MonadLogger.NoLoggingT (t2 (m :: Type -> Type))
+  instance
+    ( Monad (t2 m)
+    ) => MonadLogger.MonadLogger (ComposeT MonadLogger.NoLoggingT t2 m)
+
+-- | Set by 'MonadLogger.WriterLoggingT'.
+deriving via MonadLogger.WriterLoggingT (t2 (m :: Type -> Type))
+  instance
+    ( Monad (t2 m)
+    ) => MonadLogger.MonadLogger (ComposeT MonadLogger.WriterLoggingT t2 m)
+
+-- TODO: `MonadIO m` and `MonadTrans t2` should not be required for this instance
+-- | /OVERLAPPABLE/.
+-- Elevated to @(t2 m)@.
+deriving via Elevator t1 (t2 (m :: Type -> Type))
+  instance {-# OVERLAPPABLE #-}
+    ( MonadLogger.MonadLoggerIO (t2 m)
+    , MonadTrans t1
+    , MonadIO m
+    , MonadTrans t2
+    ) => MonadLogger.MonadLoggerIO (ComposeT t1 t2 m)
+
+-- TODO: `MonadIO m` and `MonadTrans t2` should not be required for this instance
+-- | Set by 'MonadLogger.LoggingT'.
+deriving via MonadLogger.LoggingT (t2 (m :: Type -> Type))
+  instance
+    ( MonadIO (t2 m)
+    , MonadIO m
+    , MonadTrans t2
+    ) => MonadLogger.MonadLoggerIO (ComposeT MonadLogger.LoggingT t2 m)
+
+-- TODO: `MonadIO m` and `MonadTrans t2` should not be required for this instance
+-- | Set by 'MonadLogger.NoLoggingT'.
+deriving via MonadLogger.NoLoggingT (t2 (m :: Type -> Type))
+  instance
+    ( MonadIO (t2 m)
+    , MonadIO m
+    , MonadTrans t2
+    ) => MonadLogger.MonadLoggerIO (ComposeT MonadLogger.NoLoggingT t2 m)
 #endif
 
 #if defined(VERSION_mtl)
diff --git a/src/Control/Monad/Trans/Elevator.hs b/src/Control/Monad/Trans/Elevator.hs
--- a/src/Control/Monad/Trans/Elevator.hs
+++ b/src/Control/Monad/Trans/Elevator.hs
@@ -23,6 +23,10 @@
 import Control.Monad.Logic.Class qualified as LogicT
 #endif
 
+#if defined(VERSION_monad_logger)
+import Control.Monad.Logger qualified as MonadLogger
+#endif
+
 #if defined(VERSION_mtl)
 import Control.Monad.Accum qualified as Mtl
 import Control.Monad.Cont.Class qualified as Mtl
@@ -145,6 +149,15 @@
 instance (LogicT.MonadLogic m, MonadTransControlIdentity t) => LogicT.MonadLogic (Elevator t m) where
   msplit tma = (((\(a, b) -> (a, lift b)) <$>) <$>) $
     liftWithIdentity $ \runT -> LogicT.msplit $ runT tma
+#endif
+
+#if defined(VERSION_monad_logger)
+instance (MonadLogger.MonadLogger m, MonadTrans t) => MonadLogger.MonadLogger (Elevator t m) where
+  monadLoggerLog location logSource logLevel = lift .
+    MonadLogger.monadLoggerLog location logSource logLevel
+
+instance (MonadLogger.MonadLoggerIO m, MonadTrans t) => MonadLogger.MonadLoggerIO (Elevator t m) where
+  askLoggerIO = lift MonadLogger.askLoggerIO
 #endif
 
 #if defined(VERSION_mtl)
