diff --git a/little-rio.cabal b/little-rio.cabal
--- a/little-rio.cabal
+++ b/little-rio.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: d22342ec62f05927c43b7ecfdacef567fa519fafdf63e0545b49683ac1a14856
+-- hash: c4d3676360878246e0cc19b1cd117171bed224a6f806b03e54e033317210f478
 
 name:           little-rio
-version:        0.2.0
+version:        0.2.1
 synopsis:       When you need just the RIO monad
 description:    Please see the README on GitHub at <https://github.com/ejconlon/little-rio#readme>
 category:       Control
diff --git a/src/LittleRIO.hs b/src/LittleRIO.hs
--- a/src/LittleRIO.hs
+++ b/src/LittleRIO.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -13,6 +14,9 @@
   ( HasResourceMap (..)
   , HasStateRef (..)
   , HasWriteRef (..)
+  , SimpleResourceEnv (..)
+  , SimpleStateEnv (..)
+  , SimpleWriteEnv (..)
   , SomeRef (..)
   , ResourceMap
   , RIO (..)
@@ -25,6 +29,9 @@
   , modifyStateRef
   , passWriteRef
   , putStateRef
+  , runSimpleResourceRIO
+  , runSimpleStateRIO
+  , runSimpleWriteRIO
   , runRIO
   , readSomeRef
   , resourceRIO
@@ -45,7 +52,7 @@
 import Control.Monad.Trans.Resource.Internal (MonadResource (..), ReleaseMap, ResourceT (..))
 import Control.Monad.Writer (MonadWriter (..))
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
-import Lens.Micro (Lens')
+import Lens.Micro (Lens', lens)
 import Lens.Micro.Mtl (view)
 import Prelude
 
@@ -70,9 +77,9 @@
   runRIO env' m
 
 liftRIO :: (MonadIO m, MonadReader env m) => RIO env a -> m a
-liftRIO rio = do
+liftRIO m = do
   env <- ask
-  runRIO env rio
+  runRIO env m
 
 unliftRIO :: MonadIO m => env -> m (UnliftIO (RIO env))
 unliftRIO env = liftIO (runRIO env askUnliftIO)
@@ -103,6 +110,21 @@
 instance HasStateRef a (SomeRef a) where
   stateRefL = id
 
+data SimpleStateEnv st env = SimpleStateEnv
+  { sseRef :: !(SomeRef st)
+  , sseEnv :: !env
+  } deriving (Functor, Foldable, Traversable)
+
+instance HasStateRef st (SimpleStateEnv st env) where
+  stateRefL = lens sseRef (\(SimpleStateEnv _ env) st -> SimpleStateEnv st env)
+
+runSimpleStateRIO :: MonadIO m => st -> env -> RIO (SimpleStateEnv st env) a -> m (a, st)
+runSimpleStateRIO st env m = do
+  ref <- newSomeRef st
+  a <- runRIO (SimpleStateEnv ref env) m
+  st' <- readSomeRef ref
+  pure (a, st')
+
 getStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => m st
 getStateRef = do
   ref <- view stateRefL
@@ -128,6 +150,21 @@
 instance HasWriteRef a (SomeRef a) where
   writeRefL = id
 
+data SimpleWriteEnv w env = SimpleWriteEnv
+  { sweRef :: !(SomeRef w)
+  , sweEnv :: !env
+  } deriving (Functor, Foldable, Traversable)
+
+instance HasWriteRef w (SimpleWriteEnv w env) where
+  writeRefL = lens sweRef (\(SimpleWriteEnv _ env) w -> SimpleWriteEnv w env)
+
+runSimpleWriteRIO :: (MonadIO m, Monoid w) => env -> RIO (SimpleWriteEnv w env) a -> m (a, w)
+runSimpleWriteRIO env m = do
+  ref <- newSomeRef mempty
+  a <- runRIO (SimpleWriteEnv ref env) m
+  w <- readSomeRef ref
+  pure (a, w)
+
 tellWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m, Semigroup w) => w -> m ()
 tellWriteRef value = do
   ref <- view writeRefL
@@ -167,6 +204,17 @@
 
 instance HasResourceMap (IORef ReleaseMap) where
   resourceMapL = id
+
+data SimpleResourceEnv env = SimpleResourceEnv
+  { sreMap :: !ResourceMap
+  , sreEnv :: !env
+  } deriving (Functor, Foldable, Traversable)
+
+instance HasResourceMap (SimpleResourceEnv env) where
+  resourceMapL = lens sreMap (\(SimpleResourceEnv _ env) m -> SimpleResourceEnv m env)
+
+runSimpleResourceRIO :: MonadUnliftIO m => env -> RIO (SimpleResourceEnv env) a -> m a
+runSimpleResourceRIO env m = withResourceMap (\rm -> runRIO (SimpleResourceEnv rm env) m)
 
 resourceRIO :: HasResourceMap env => ResourceT IO a -> RIO env a
 resourceRIO (ResourceT f) = view resourceMapL >>= liftIO . f
