diff --git a/little-rio.cabal b/little-rio.cabal
--- a/little-rio.cabal
+++ b/little-rio.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.2.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 29a5ac4cb7039c63f9b16ffa254e0100726fd220aa6c7721a65cc7761fc98648
+-- hash: 2c34a0cd81d30bbaa6fe452cd9718b33a590ce2ffd05268cfab6f60d7989b54a
 
 name:           little-rio
-version:        2.0.1
+version:        3.0.0
 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
@@ -46,9 +46,9 @@
   build-depends:
       base >=4.12 && <5
     , exceptions >=0.10 && <1
-    , little-logger >=1.0.2 && <1.1
-    , microlens >=0.4 && <1
+    , little-logger >=3.0 && <4
     , mtl >=2.2 && <3
+    , optics >=0.4 && <1
     , primitive >=0.7.0.1 && <1
     , resourcet >=1.2.4.2 && <2
     , unliftio-core >=0.1 && <1
diff --git a/src/LittleRIO.hs b/src/LittleRIO.hs
--- a/src/LittleRIO.hs
+++ b/src/LittleRIO.hs
@@ -23,7 +23,6 @@
   )
 where
 
-import Control.Applicative (liftA2)
 import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
 import Control.Monad.IO.Class (MonadIO (..))
 import Control.Monad.IO.Unlift (MonadUnliftIO (..), UnliftIO, askUnliftIO)
@@ -34,9 +33,8 @@
 import Control.Monad.Trans.Resource.Internal (unResourceT)
 import Control.Monad.Writer (MonadWriter (..))
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
-import Lens.Micro (Lens')
-import Lens.Micro.Extras (view)
 import LittleLogger (LogActionWrapperM (..), MonadLogger)
+import Optics (Lens', equality', view)
 
 newtype RIO env a = RIO {unRIO :: ReaderT env IO a}
   deriving newtype
@@ -53,10 +51,10 @@
     )
   deriving (MonadLogger) via LogActionWrapperM env (RIO env)
 
-instance Semigroup a => Semigroup (RIO env a) where
+instance (Semigroup a) => Semigroup (RIO env a) where
   (<>) = liftA2 (<>)
 
-instance Monoid a => Monoid (RIO env a) where
+instance (Monoid a) => Monoid (RIO env a) where
   mempty = pure mempty
   mappend = (<>)
 
@@ -75,34 +73,34 @@
   env <- ask
   runRIO env m
 
-unliftRIO :: MonadIO m => env -> m (UnliftIO (RIO env))
+unliftRIO :: (MonadIO m) => env -> m (UnliftIO (RIO env))
 unliftRIO env = liftIO (runRIO env askUnliftIO)
 
-runRIO :: MonadIO m => env -> RIO env a -> m a
+runRIO :: (MonadIO m) => env -> RIO env a -> m a
 runRIO r m = liftIO (runReaderT (unRIO m) r)
 
 data SomeRef a = SomeRef !(IO a) !(a -> IO ())
 
-readSomeRef :: MonadIO m => SomeRef a -> m a
+readSomeRef :: (MonadIO m) => SomeRef a -> m a
 readSomeRef (SomeRef x _) = liftIO x
 
-writeSomeRef :: MonadIO m => SomeRef a -> a -> m ()
+writeSomeRef :: (MonadIO m) => SomeRef a -> a -> m ()
 writeSomeRef (SomeRef _ x) = liftIO . x
 
-modifySomeRef :: MonadIO m => SomeRef a -> (a -> a) -> m ()
+modifySomeRef :: (MonadIO m) => SomeRef a -> (a -> a) -> m ()
 modifySomeRef (SomeRef read' write) f = liftIO (read' >>= write . f)
 
 ioRefToSomeRef :: IORef a -> SomeRef a
 ioRefToSomeRef ref = SomeRef (readIORef ref) (writeIORef ref)
 
-newSomeRef :: MonadIO m => a -> m (SomeRef a)
+newSomeRef :: (MonadIO m) => a -> m (SomeRef a)
 newSomeRef = liftIO . fmap ioRefToSomeRef . newIORef
 
 class HasStateRef st env | env -> st where
   stateRefL :: Lens' env (SomeRef st)
 
 instance HasStateRef a (SomeRef a) where
-  stateRefL = id
+  stateRefL = equality'
 
 getStateRef :: (HasStateRef st env, MonadReader env m, MonadIO m) => m st
 getStateRef = do
@@ -119,7 +117,7 @@
   ref <- asks (view stateRefL)
   liftIO (modifySomeRef ref f)
 
-instance HasStateRef st env => MonadState st (RIO env) where
+instance (HasStateRef st env) => MonadState st (RIO env) where
   get = getStateRef
   put = putStateRef
 
@@ -127,7 +125,7 @@
   writeRefL :: Lens' env (SomeRef w)
 
 instance HasWriteRef a (SomeRef a) where
-  writeRefL = id
+  writeRefL = equality'
 
 tellWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m, Semigroup w) => w -> m ()
 tellWriteRef value = do
@@ -159,19 +157,17 @@
 
 type ResourceMap = InternalState
 
-withResourceMap :: MonadUnliftIO m => (ResourceMap -> m a) -> m a
+withResourceMap :: (MonadUnliftIO m) => (ResourceMap -> m a) -> m a
 withResourceMap inner = runResourceT (withInternalState inner)
 
--- withRunInIO (\run -> runResourceT (ResourceT (run . inner)))
-
 class HasResourceMap env where
   resourceMapL :: Lens' env ResourceMap
 
 instance HasResourceMap ResourceMap where
-  resourceMapL = id
+  resourceMapL = equality'
 
-resourceRIO :: HasResourceMap env => ResourceT IO a -> RIO env a
+resourceRIO :: (HasResourceMap env) => ResourceT IO a -> RIO env a
 resourceRIO m = asks (view resourceMapL) >>= liftIO . unResourceT m
 
-instance HasResourceMap env => MonadResource (RIO env) where
+instance (HasResourceMap env) => MonadResource (RIO env) where
   liftResourceT = resourceRIO
