diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for deriving-trans
 
+## 0.6.1.0 *27 Jan 2023*
+
+* Add optional dependency `random >= 1.2`.
+* Add `StatefulGen`, `FrozenGen` and `RandomGenM` instances to `Elevator` and `ComposeT`.
+  There are no "base-case" instances because there are no related transformers, just base monads.
+
 ## 0.6.0.0 *23 Jan 2023*
 
 * Update dependencies:
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.6.0.0
+version: 0.6.1.0
 synopsis: Derive instances for monad transformer stacks
 description:
   Implementing instances for monad transformer stacks can be tedious.
@@ -40,6 +40,11 @@
   description:
     Implement instances for `PrimMonad`.
 
+flag random
+  default: True
+  description:
+    Implement instances for random's type classes.
+
 flag resourcet
   default: True
   description:
@@ -75,6 +80,9 @@
   if flag(primitive)
     build-depends:
       , primitive
+  if flag(random)
+    build-depends:
+      , random >= 1.2
   if flag(resourcet)
     build-depends:
       , resourcet >= 1.2
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
@@ -49,6 +49,11 @@
 import Control.Monad.Primitive qualified as Primitive
 #endif
 
+#if defined(VERSION_random)
+import Data.Functor.Const qualified as Random
+import System.Random.Stateful qualified as Random
+#endif
+
 #if defined(VERSION_resourcet)
 import Control.Monad.Trans.Resource qualified as ResourceT
 #endif
@@ -377,6 +382,34 @@
     Primitive.PrimMonad (ComposeT t1 t2 m)
 #endif
 
+#if defined(VERSION_random)
+-- TODO: `MonadIO (t2 m)` should not be required for this instance
+-- | /OVERLAPPABLE/.
+-- Elevated to @(t2 m)@.
+instance {-# OVERLAPPABLE #-} (Random.StatefulGen g (t2 m), MonadTrans t1, MonadIO (t2 m)) => Random.StatefulGen (Random.Const g (ComposeT t1 t2)) (ComposeT t1 t2 m) where
+  uniformWord32R word32 = ComposeT . lift . Random.uniformWord32R word32 . Random.getConst
+  uniformWord64R word64 = ComposeT . lift . Random.uniformWord64R word64 . Random.getConst
+  uniformWord8 = ComposeT . lift . Random.uniformWord8 . Random.getConst
+  uniformWord16 = ComposeT . lift . Random.uniformWord16 . Random.getConst
+  uniformWord32 = ComposeT . lift . Random.uniformWord32 . Random.getConst
+  uniformWord64 = ComposeT . lift . Random.uniformWord64 . Random.getConst
+  uniformShortByteString n = ComposeT . lift . Random.uniformShortByteString n . Random.getConst
+
+-- TODO: `MonadIO (t2 m)` should not be required for this instance
+-- | /OVERLAPPABLE/.
+-- Elevated to @(t2 m)@.
+instance {-# OVERLAPPABLE #-} (Random.FrozenGen f (t2 m), MonadTrans t1, MonadIO (t2 m)) => Random.FrozenGen (Random.Const f (ComposeT t1 t2)) (ComposeT t1 t2 m) where
+  type MutableGen (Random.Const f (ComposeT t1 t2)) (ComposeT t1 t2 m) = Random.Const (Random.MutableGen f (t2 m)) (ComposeT t1 t2)
+  freezeGen = ComposeT . lift . fmap Random.Const . Random.freezeGen . Random.getConst
+  thawGen = ComposeT . lift . fmap Random.Const . Random.thawGen . Random.getConst
+
+-- TODO: `MonadIO (t2 m)` should not be required for this instance
+-- | /OVERLAPPABLE/.
+-- Elevated to @(t2 m)@.
+instance {-# OVERLAPPABLE #-} (Random.RandomGenM g r (t2 m), MonadTrans t1, MonadIO (t2 m)) => Random.RandomGenM (Random.Const g (ComposeT t1 t2)) r (ComposeT t1 t2 m) where
+  applyRandomGenM f = ComposeT . lift . Random.applyRandomGenM f . Random.getConst
+#endif
+
 #if defined(VERSION_resourcet)
 -- TODO: `MonadIO m` and `MonadTrans t2` should not be required for this instance
 -- | /OVERLAPPABLE/.
@@ -541,7 +574,7 @@
 -- runAppT :: AppT m a -> m ('StT' AppT a)
 -- runAppT appTma =
 --   'Control.Monad.Trans.Compose.Transparent.runTransparentT'
---     'Control.Monad.Trans.Compose.Infix../>' (\\ tma -> 'T.runReaderT' tma 'True')
+--     'Control.Monad.Trans.Compose.Infix../>' (\\ tma -> 'Control.Monad.Trans.Reader.runReaderT' tma 'True')
 --     'Control.Monad.Trans.Compose.Infix../>' runCustomT
 --     'Control.Monad.Trans.Compose.Infix../>' runReaderT'
 --     'Control.Monad.Trans.Compose.Infix../>' runStateT'
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
@@ -34,6 +34,11 @@
 import Control.Monad.Primitive qualified as Primitive
 #endif
 
+#if defined(VERSION_random)
+import Data.Functor.Const qualified as Random
+import System.Random.Stateful qualified as Random
+#endif
+
 #if defined(VERSION_resourcet)
 import Control.Monad.Trans.Resource qualified as ResourceT
 #endif
@@ -147,6 +152,28 @@
 instance (Primitive.PrimMonad m, MonadTrans t) => Primitive.PrimMonad (Elevator t m) where
   type PrimState (Elevator t m) = Primitive.PrimState m
   primitive = lift . Primitive.primitive
+#endif
+
+#if defined(VERSION_random)
+-- TODO: `MonadIO m` should be redundant.
+instance (Random.StatefulGen g m, MonadTrans t, MonadIO m) => Random.StatefulGen (Random.Const g (Elevator t)) (Elevator t m) where
+  uniformWord32R word32 = lift . Random.uniformWord32R word32 . Random.getConst
+  uniformWord64R word64 = lift . Random.uniformWord64R word64 . Random.getConst
+  uniformWord8 = lift . Random.uniformWord8 . Random.getConst
+  uniformWord16 = lift . Random.uniformWord16 . Random.getConst
+  uniformWord32 = lift . Random.uniformWord32 . Random.getConst
+  uniformWord64 = lift . Random.uniformWord64 . Random.getConst
+  uniformShortByteString n = lift . Random.uniformShortByteString n . Random.getConst
+
+-- TODO: `MonadIO m` should be redundant.
+instance (Random.FrozenGen f m, MonadTrans t, MonadIO m) => Random.FrozenGen (Random.Const f (Elevator t)) (Elevator t m) where
+  type MutableGen (Const f (Elevator t)) (Elevator t m) = Const (Random.MutableGen f m) (Elevator t)
+  freezeGen = lift . fmap Random.Const . Random.freezeGen . Random.getConst
+  thawGen = lift . fmap Random.Const . Random.thawGen . Random.getConst
+
+-- TODO: `MonadIO m` should be redundant.
+instance (Random.RandomGenM g r m, MonadTrans t, MonadIO m) => Random.RandomGenM (Random.Const g (Elevator t)) r (Elevator t m) where
+  applyRandomGenM f = lift . Random.applyRandomGenM f . Random.getConst
 #endif
 
 #if defined(VERSION_resourcet)
