diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for polysemy
 
+## 0.5.1.0 (2019-06-28)
+
+- New combinators for `Polysemy.Error`: `fromEither` and `fromEitherM`
+
 ## 0.5.0.1 (2019-06-27)
 
 - Fixed a bug where `intercept` and `interceptH` wouldn't correctly handle
diff --git a/polysemy.cabal b/polysemy.cabal
--- a/polysemy.cabal
+++ b/polysemy.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: c5b3cd4bd7beb50a960dbde4942d2d79df95157a5acf1de0d91508c7362cd0b5
+-- hash: e2b39ec6e1f466a89ba47a4f54b80b55c0b68a694c2dd08f5c46e0f6ca85437a
 
 name:           polysemy
-version:        0.5.0.1
+version:        0.5.1.0
 synopsis:       Higher-order, low-boilerplate, zero-cost free monads.
 description:    Please see the README on GitHub at <https://github.com/isovector/polysemy#readme>
 category:       Language
diff --git a/src/Polysemy/Error.hs b/src/Polysemy/Error.hs
--- a/src/Polysemy/Error.hs
+++ b/src/Polysemy/Error.hs
@@ -7,6 +7,8 @@
     -- * Actions
   , throw
   , catch
+  , fromEither
+  , fromEitherM
 
     -- * Interpretations
   , runError
@@ -15,6 +17,7 @@
   ) where
 
 import qualified Control.Exception as X
+import           Control.Monad
 import qualified Control.Monad.Trans.Except as E
 import           Data.Bifunctor (first)
 import           Data.Typeable
@@ -36,6 +39,32 @@
 
 
 ------------------------------------------------------------------------------
+-- | Upgrade an 'Either' into an 'Error' effect.
+--
+-- @since 0.5.1.0
+fromEither
+    :: Member (Error e) r
+    => Either e a
+    -> Sem r a
+fromEither (Left e) = throw e
+fromEither (Right a) = pure a
+
+
+------------------------------------------------------------------------------
+-- | A combinator doing 'sendM' and 'fromEither' at the same time. Useful for
+-- interoperating with 'IO'.
+--
+-- @since 0.5.1.0
+fromEitherM
+    :: ( Member (Error e) r
+       , Member (Lift m) r
+       )
+    => m (Either e a)
+    -> Sem r a
+fromEitherM = fromEither <=< sendM
+
+
+------------------------------------------------------------------------------
 -- | Run an 'Error' effect in the style of
 -- 'Control.Monad.Trans.Except.ExceptT'.
 runError
@@ -126,6 +155,7 @@
 {-# INLINE runErrorInIO #-}
 
 
+-- TODO(sandy): Can we use the new withLowerToIO machinery for this?
 runErrorAsExc
     :: forall e r a. ( Typeable e
        , Member (Lift IO) r
