diff --git a/core/HaskellWorks/Polysemy.hs b/core/HaskellWorks/Polysemy.hs
--- a/core/HaskellWorks/Polysemy.hs
+++ b/core/HaskellWorks/Polysemy.hs
@@ -44,6 +44,8 @@
     catch,
     trap,
     trap_,
+    embedRunExceptT,
+    embedThrowExceptT,
     fromEither,
     fromEitherM,
     fromException,
diff --git a/core/HaskellWorks/Polysemy/Error.hs b/core/HaskellWorks/Polysemy/Error.hs
--- a/core/HaskellWorks/Polysemy/Error.hs
+++ b/core/HaskellWorks/Polysemy/Error.hs
@@ -2,8 +2,11 @@
   ( module HaskellWorks.Error
   , trap
   , trap_
+  , embedRunExceptT
+  , embedThrowExceptT
   ) where
 
+import           Control.Monad.Except
 import           HaskellWorks.Error
 import           HaskellWorks.Polysemy.Prelude
 import           Polysemy
@@ -26,3 +29,19 @@
   -> Sem r a
 trap_ h =
   trap (const h)
+
+embedRunExceptT :: ()
+  => Member (Embed m) r
+  => ExceptT e m a
+  -> Sem r (Either e a)
+embedRunExceptT = embed . runExceptT
+
+-- | Run an embedded 'ExceptT' effect in a 'Sem' monad and throw any errors.
+embedThrowExceptT :: ()
+  => Member (Error e) r
+  => Member (Embed m) r
+  => ExceptT e m a
+  -> Sem r a
+embedThrowExceptT f =
+  embedRunExceptT f
+    & onLeftM throw
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Workspace.hs
@@ -32,6 +32,7 @@
 -- The directory will be deleted if the block succeeds, but left behind if
 -- the block fails.
 workspace :: ()
+  => HasCallStack
   => Member Hedgehog r
   => Member Log r
   => Member (Embed IO) r
@@ -62,6 +63,7 @@
 --
 -- The 'prefix' argument should not contain directory delimeters.
 moduleWorkspace ::  ()
+  => HasCallStack
   => Member Hedgehog r
   => Member Log r
   => Member (Embed IO) r
diff --git a/hw-polysemy.cabal b/hw-polysemy.cabal
--- a/hw-polysemy.cabal
+++ b/hw-polysemy.cabal
@@ -1,6 +1,6 @@
 cabal-version:          3.4
 name:                   hw-polysemy
-version:                0.2.8.0
+version:                0.2.9.0
 synopsis:               Opinionated polysemy library
 description:            Opinionated polysemy library.
 license:                Apache-2.0
@@ -33,6 +33,7 @@
 common hedgehog                   { build-depends: hedgehog                                    < 1.5    }
 common network                    { build-depends: network                                     < 3.3    }
 common lens                       { build-depends: lens                                        < 5.4    }
+common mtl                        { build-depends: mtl                                         < 5.4    }
 common polysemy                   { build-depends: polysemy                                    < 2      }
 common polysemy-log               { build-depends: polysemy-log                                < 0.11   }
 common polysemy-plugin            { build-depends: polysemy-plugin                             < 0.5    }
@@ -95,6 +96,7 @@
                         ghc-prim,
                         hedgehog,
                         lens,
+                        mtl,
                         network,
                         polysemy,
                         polysemy-log,
