diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.1.1.0
+
+* Added `streamConsume`, `cycleToStream`, `takeConsume` (thanks to
+  @iteratee)
+
+* Restrict the kind of the argument to
+  `Bluefin.Internal.Exception.Scoped.Exception` and
+  `Bluefin.Internal.ConstEffect` to `Effects`
+
 ## 0.1.0.0
 
 * Implement `Exception` using `Eff` not naked `IO`
diff --git a/bluefin-internal.cabal b/bluefin-internal.cabal
--- a/bluefin-internal.cabal
+++ b/bluefin-internal.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               bluefin-internal
-version:            0.1.0.0
+version:            0.1.1.0
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
@@ -41,8 +41,7 @@
       GeneralisedNewtypeDeriving
       HexFloatLiterals
       ImplicitPrelude
-      -- Not available until 8.10
-      -- ImportQualifiedPost
+      ImportQualifiedPost
       InstanceSigs
       KindSignatures
       MonomorphismRestriction
@@ -57,8 +56,7 @@
       RelaxedPolyRec
       ScopedTypeVariables
       StandaloneDeriving
-      -- Not available in 8.6
-      -- StandaloneKindSignatures
+      StandaloneKindSignatures
       StarIsType
       TraditionalRecordSyntax
       TupleSections
@@ -78,12 +76,11 @@
     hs-source-dirs: src
     build-depends:
       async >= 2.2 && < 2.3,
-      base >= 4.12 && < 4.22,
+      base >= 4.14 && < 4.22,
       unliftio-core < 0.3,
       transformers < 0.7,
       transformers-base < 0.5,
       monad-control < 1.1
-    ghc-options: -Wall
     exposed-modules:
       Bluefin.Internal,
       Bluefin.Internal.Examples,
diff --git a/src/Bluefin/Internal.hs b/src/Bluefin/Internal.hs
--- a/src/Bluefin/Internal.hs
+++ b/src/Bluefin/Internal.hs
@@ -168,6 +168,15 @@
   Eff es r
 consumeStream r s = connectCoroutines r (\() -> s)
 
+-- | Argument-flipped version of 'consumeStream'
+streamConsume ::
+  forall a (es :: Effects) r.
+  (forall (e :: Effects). Stream a e -> Eff (e :& es) r) ->
+  (forall (e :: Effects). Consume a e -> Eff (e :& es) r) ->
+  -- | ͘
+  Eff es r
+streamConsume s c = consumeStream c s
+
 zipCoroutines ::
   (e1 :> es) =>
   Coroutine (a1, a2) b e1 ->
@@ -333,7 +342,12 @@
 
 type Consume a = Coroutine () a
 
--- | You can define a @Handle@ instance for your compound handles.  As
+-- | Every Bluefin handle should have an instance of class @Handle@.
+-- Built-in handles, such as 'Exception', 'State' and 'IOE', come with
+-- @Handle@ instances.
+--
+-- You should define a @Handle@ instance for each handle that you
+-- define yourself.  As
 -- an example, an "application" handle with a dynamic effect for
 -- database queries, a concrete effect for application state and a
 -- concrete effect for a logging effect might look like this:
@@ -348,7 +362,7 @@
 --
 -- To define @mapHandle@ for @Application@ you should apply
 -- @mapHandle@ to all the fields that are themeselves handles and
--- apply @useImplUnder@ to all the fields that are dynamic effects:
+-- apply 'useImplUnder' to all the fields that are dynamic effects:
 --
 -- @
 -- instance Handle Application where
@@ -359,7 +373,7 @@
 --         logger = l
 --       } =
 --       MkApplication
---         { queryDatabase = \s i -> useImplUnder (q s i),
+--         { queryDatabase = \\s i -> useImplUnder (q s i),
 --           applicationState = mapHandle a,
 --           logger = mapHandle l
 --         }
@@ -1098,6 +1112,45 @@
   Eff es r
 catMaybes s y = mapMaybe id s y
 
+-- |
+-- @
+-- runPureEff $ yieldToList $ \yOut -> do
+--   consumeStream
+--     (\c -> takeConsume 6 c yOut)
+--     (\yIn -> cycleToStream [1..3] yIn)
+-- ([1,2,3,1,2,3],())
+-- @
+cycleToStream ::
+  (Foldable f, ea :> es) =>
+  f a ->
+  Stream a ea ->
+  -- | ͘
+  Eff es ()
+cycleToStream f y = do
+  forever (inFoldable f y)
+
+-- |
+-- @
+-- runPureEff $ yieldToList $ \yOut -> do
+--   consumeStream
+--     (\c -> takeConsume 4 c yOut)
+--     (\yIn -> inFoldable [1..10] yIn)
+-- ([1,2,3,4],())
+-- @
+takeConsume ::
+  (ea :> es, eb :> es) =>
+  Int ->
+  Consume a ea ->
+  Stream a eb ->
+  -- | ͘
+  Eff es ()
+takeConsume count source sink = loop count
+  where
+    loop c | c <= 0 = pure ()
+    loop c = do
+      await source >>= yield sink
+      loop (c - 1)
+
 type Jump = EarlyReturn ()
 
 -- |
@@ -1411,7 +1464,7 @@
 
 instance (Handle h) => Handle (HandleReader h) where mapHandle = mapHandleReader
 
-newtype ConstEffect r e = MkConstEffect r
+newtype ConstEffect r (e :: Effects) = MkConstEffect r
 
 runConstEffect ::
   r ->
diff --git a/src/Bluefin/Internal/Examples.hs b/src/Bluefin/Internal/Examples.hs
--- a/src/Bluefin/Internal/Examples.hs
+++ b/src/Bluefin/Internal/Examples.hs
@@ -71,7 +71,7 @@
   yield y 100
 
 withYieldToListExample :: Int
-withYieldToListExample = runPureEff $ withYieldToList $ \y -> do
+withYieldToListExample = runPureEff $ withYieldToList @Int $ \y -> do
   yield y 1
   yield y 2
   yield y 100
@@ -95,13 +95,27 @@
     yield y (i * 10)
 
 ignoreStreamExample :: Int
-ignoreStreamExample = runPureEff $ ignoreStream $ \y -> do
+ignoreStreamExample = runPureEff $ ignoreStream @Int $ \y -> do
   for_ [0 .. 4] $ \i -> do
     yield y i
     yield y (i * 10)
 
   pure 42
 
+-- ([1,2,3,1,2,3],())
+cycleToStreamExample :: ([Int], ())
+cycleToStreamExample = runPureEff $ yieldToList $ \yOut -> do
+  consumeStream
+    (\c -> takeConsume 6 c yOut)
+    (\yIn -> cycleToStream [1 .. 3] yIn)
+
+-- ([1,2,3,4],())
+takeConsumeExample :: ([Int], ())
+takeConsumeExample = runPureEff $ yieldToList $ \yOut -> do
+  consumeStream
+    (\c -> takeConsume 4 c yOut)
+    (\yIn -> inFoldable [1 .. 10] yIn)
+
 inFoldableExample :: ([Int], ())
 inFoldableExample = runPureEff $ yieldToList $ inFoldable [1, 2, 100]
 
@@ -444,7 +458,7 @@
 
 writerExample2 :: Bool
 writerExample2 = getAny $ runPureEff $ execWriter $ \w -> do
-  for_ [1 .. 10] $ \_ -> tell w (Any True)
+  for_ [1 :: Int .. 10] $ \_ -> tell w (Any True)
 
 while :: Eff es Bool -> Eff es a -> Eff es ()
 while condM body =
@@ -963,7 +977,7 @@
   bracket
     (pure ())
     -- Always set the boolean indicating that we have terminated
-    (\_ -> modify st (\(c, b) -> (c, True)))
+    (\_ -> modify st (\(c, _b) -> (c, True)))
     -- Perform the given effectful action, then increment the counter
     (\_ -> do act; modify st (\(c, b) -> ((c + 1), b)))
 
@@ -978,7 +992,7 @@
 polymorphicBracketExample2 :: (Integer, Bool)
 polymorphicBracketExample2 =
   runPureEff $ do
-    (_res, st) <- runState (0, False) $ \st -> try $ \e -> polymorphicBracket st (throw e 42)
+    (_res, st) <- runState (0, False) $ \st -> try @Int $ \e -> polymorphicBracket st (throw e 42)
     pure st
 
 pipesExample1 :: IO ()
diff --git a/src/Bluefin/Internal/Exception/Scoped.hs b/src/Bluefin/Internal/Exception/Scoped.hs
--- a/src/Bluefin/Internal/Exception/Scoped.hs
+++ b/src/Bluefin/Internal/Exception/Scoped.hs
@@ -9,6 +9,7 @@
 import Control.Exception (throwIO, tryJust)
 import qualified Control.Exception
 import Data.Type.Equality ((:~~:) (HRefl))
+import Data.Kind (Type)
 
 try :: (Exception e -> IO a) -> IO (Either e a)
 try k = do
@@ -20,7 +21,7 @@
 throw :: Exception e -> e -> IO a
 throw ex e = throwIO (MkInFlight ex e)
 
-newtype Exception e = MkException (Key e)
+newtype Exception (e :: Type) = MkException (Key e)
 
 data InFlight = forall e. MkInFlight !(Exception e) !e
 
diff --git a/src/Bluefin/Internal/Key.hs b/src/Bluefin/Internal/Key.hs
--- a/src/Bluefin/Internal/Key.hs
+++ b/src/Bluefin/Internal/Key.hs
@@ -1,6 +1,10 @@
 -- Like Key from vault:
 --
 -- https://github.com/HeinrichApfelmus/vault/blob/master/src/Data/Vault/ST/backends/GHC.h#L19C29-L20C1
+--
+-- and Tag from prim-uniq:
+--
+-- https://hackage.haskell.org/package/prim-uniq-0.2/docs/Data-Unique-Tag.html
 
 {-# LANGUAGE RoleAnnotations #-}
 
