diff --git a/lifx-lan.cabal b/lifx-lan.cabal
--- a/lifx-lan.cabal
+++ b/lifx-lan.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               lifx-lan
-version:            0.8.1
+version:            0.8.2
 license:            BSD-3-Clause
 license-file:       LICENSE
 author:             George Thomas
diff --git a/src/Lifx/Lan/Internal.hs b/src/Lifx/Lan/Internal.hs
--- a/src/Lifx/Lan/Internal.hs
+++ b/src/Lifx/Lan/Internal.hs
@@ -101,11 +101,10 @@
         ExceptT $ local f $ unLifx e s m
 instance MonadState s m => MonadState s (LifxT m) where
     state = lift . state
-instance MonadError e m => MonadError (Either e LifxError) (LifxT m) where
-    throwError = either (lift . throwError @e @m) (LifxT . throwError)
-    catchError m h = LifxT $ StateT \s -> ReaderT \e -> ExceptT do
-        (m', s'') <- either ((,s) . h . Right) (first pure) <$> unLifx e s m
-        catchError @e @m (unLifx e s'' m') (unLifx e s'' . h . Left)
+instance MonadError e m => MonadError e (LifxT m) where
+    throwError = lift . throwError @e @m
+    catchError m h = LifxT $ StateT \s -> ReaderT \e ->
+        ExceptT $ catchError @e @m (unLifx e s m) (unLifx e s . h)
 
 unLifx :: (Socket, Word32, Int) -> Word8 -> LifxT m a -> m (Either LifxError (a, Word8))
 unLifx e s = runExceptT . flip runReaderT e . flip runStateT s . (.unwrap)
