diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Changelog for polysemy
 
+## 0.5.0.1 (2019-06-27)
+
+- Fixed a bug where `intercept` and `interceptH` wouldn't correctly handle
+    higher-order effects
+
 ## 0.5.0.0 (2019-06-26)
 
 ### Breaking Changes
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: 5871506acb960e1595dcd500e8680727e555c25cfbd825e98b767b01c91cffc9
+-- hash: c5b3cd4bd7beb50a960dbde4942d2d79df95157a5acf1de0d91508c7362cd0b5
 
 name:           polysemy
-version:        0.5.0.0
+version:        0.5.0.1
 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
@@ -107,6 +107,7 @@
       FusionSpec
       HigherOrderSpec
       InspectorSpec
+      InterceptSpec
       OutputSpec
       ThEffectSpec
       TypeErrors
diff --git a/src/Polysemy/Internal/Combinators.hs b/src/Polysemy/Internal/Combinators.hs
--- a/src/Polysemy/Internal/Combinators.hs
+++ b/src/Polysemy/Internal/Combinators.hs
@@ -277,7 +277,7 @@
   case prj u of
     Just (Yo e s d y v) ->
       usingSem k $ fmap y $ runTactics s (raise . d) v $ f e
-    Nothing -> k u
+    Nothing -> k $ hoist (interceptH_b f) u
 {-# INLINE interceptH #-}
 
 
@@ -289,6 +289,15 @@
     -> Sem r a
 interpretH_b = interpretH
 {-# NOINLINE interpretH_b #-}
+
+
+interceptH_b
+    :: Member e r
+    => (∀ x m. e m x -> Tactical e m r x)
+    -> Sem r a
+    -> Sem r a
+interceptH_b = interceptH
+{-# NOINLINE interceptH_b #-}
 
 
 interpretInStateT_b
diff --git a/test/InterceptSpec.hs b/test/InterceptSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/InterceptSpec.hs
@@ -0,0 +1,25 @@
+module InterceptSpec where
+
+import Polysemy
+import Polysemy.Resource
+import Polysemy.Trace
+import Test.Hspec
+
+
+withTraceLogging :: Members '[Trace] r => Sem r a -> Sem r a
+withTraceLogging = intercept $ \case
+  Trace msg -> do
+    trace $ "logged " <> msg
+    trace msg
+
+spec :: Spec
+spec = describe "intercept" $ do
+  it "should weave through embedded computations" $ do
+    let (msgs, ()) = run
+                   . runTraceAsList
+                   . runResource
+                   . withTraceLogging $ do
+          trace "outside"
+          bracket (pure ()) pure (const $ trace "inside")
+    msgs `shouldBe` ["logged outside", "outside", "logged inside", "inside"]
+
