diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+3.6
+---
+* `instance Monad m => MonadSpec (Yoneda m)`
+
 3.5.1
 -----
 * Fixed a bug in the signature for `composedRepToCodensity`.
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -9,7 +9,7 @@
 
 * Right and left Kan extensions (`Ran` and `Lan`)
 * Right and left Kan lifts (`Rift` and `Lift`)
-* Both forms of the Yoneda lemma as Kan extensions (`Yoneda`)
+* Multiple forms of the Yoneda lemma (`Yoneda`)
 * The `Codensity` monad, which can be used to improve the asymptotic complexity of code over free monads (`Codensity`, `Density`)
 * A "comonad to monad-transformer transformer" that is a special case of a right Kan lift. (`CoT`, `Co`)
 
diff --git a/kan-extensions.cabal b/kan-extensions.cabal
--- a/kan-extensions.cabal
+++ b/kan-extensions.cabal
@@ -1,6 +1,6 @@
 name:          kan-extensions
 category:      Data Structures, Monads, Comonads, Functors
-version:       3.5.1
+version:       3.6
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
diff --git a/src/Data/Functor/Yoneda.hs b/src/Data/Functor/Yoneda.hs
--- a/src/Data/Functor/Yoneda.hs
+++ b/src/Data/Functor/Yoneda.hs
@@ -1,7 +1,17 @@
-{-# LANGUAGE TypeFamilies, CPP, Rank2Types, FlexibleContexts, MultiParamTypeClasses, UndecidableInstances, FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE Rank2Types #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702
 {-# LANGUAGE Trustworthy #-}
 #endif
+
+#ifndef MIN_VERSION_speculation
+#define MIN_VERSION_speculation(x,y,z) 1
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Functor.Yoneda
@@ -35,6 +45,8 @@
 import Control.Monad.Trans.Class
 import Control.Comonad
 import Control.Comonad.Trans.Class
+import Control.Concurrent.Speculation
+import Control.Concurrent.Speculation.Class
 import Data.Distributive
 import Data.Foldable
 import Data.Function (on)
@@ -49,6 +61,14 @@
 import Data.Traversable
 import Text.Read hiding (lift)
 import Prelude hiding (sequence, lookup, zipWith)
+
+instance Monad m => MonadSpec (Yoneda m) where
+  specByM f g a = Yoneda $ \k -> specBy f g (return . k) a
+  {-# INLINE specByM #-}
+#if !(MIN_VERSION_speculation(1,5,0))
+  specByM' f g a = Yoneda $ \k -> specBy' f g (return . k) a
+  {-# INLINE specByM' #-}
+#endif
 
 newtype Yoneda f a = Yoneda { runYoneda :: forall b. (a -> b) -> f b }
 
diff --git a/src/Data/Functor/Yoneda/Reduction.hs b/src/Data/Functor/Yoneda/Reduction.hs
--- a/src/Data/Functor/Yoneda/Reduction.hs
+++ b/src/Data/Functor/Yoneda/Reduction.hs
@@ -1,7 +1,14 @@
-{-# LANGUAGE CPP, GADTs, FlexibleContexts, MultiParamTypeClasses, UndecidableInstances, TypeFamilies #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeFamilies #-}
+
 #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702
 {-# LANGUAGE Trustworthy #-}
 #endif
+
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   :  (C) 2011-2013 Edward Kmett
@@ -15,7 +22,7 @@
 --
 -- <http://ncatlab.org/nlab/show/Yoneda+reduction>
 --
--- @Yoneda f@ is isomorphic to @Lan f Identity@
+-- @'Yoneda' f@ is isomorphic to @'Lan' f 'Identity'@
 ----------------------------------------------------------------------------
 module Data.Functor.Yoneda.Reduction
   ( Yoneda(..)
@@ -49,21 +56,6 @@
 data Yoneda f a where
   Yoneda :: (b -> a) -> f b -> Yoneda f a
 
--- | Yoneda "expansion"
-liftYoneda :: f a -> Yoneda f a
-liftYoneda = Yoneda id
-{-# INLINE liftYoneda #-}
-
--- | Yoneda reduction
-lowerYoneda :: Functor f => Yoneda f a -> f a
-lowerYoneda (Yoneda f m) = fmap f m
-{-# INLINE lowerYoneda #-}
-
--- | Yoneda reduction given a 'Monad'.
-lowerM :: Monad f => Yoneda f a -> f a
-lowerM (Yoneda f m) = liftM f m
-{-# INLINE lowerM #-}
-
 instance Functor (Yoneda f) where
   fmap f (Yoneda g v) = Yoneda (f . g) v
   {-# INLINE fmap #-}
@@ -218,3 +210,36 @@
   {-# INLINE unit #-}
   counit = counit . fmap lowerYoneda . lowerYoneda
   {-# INLINE counit #-}
+
+-- | Yoneda "expansion"
+--
+-- @
+-- 'liftYoneda' . 'lowerYoneda' ≡ 'id'
+-- 'lowerYoneda' . 'liftYoneda' ≡ 'id'
+-- @
+--
+--
+-- @
+-- 'lift' = 'liftYoneda'
+-- @
+liftYoneda :: f a -> Yoneda f a
+liftYoneda = Yoneda id
+{-# INLINE liftYoneda #-}
+
+-- | Yoneda reduction
+--
+-- @
+-- 'lower' = 'lowerM' = 'lowerYoneda'
+-- @
+lowerYoneda :: Functor f => Yoneda f a -> f a
+lowerYoneda (Yoneda f m) = fmap f m
+{-# INLINE lowerYoneda #-}
+
+-- | Yoneda reduction given a 'Monad'.
+--
+-- @
+-- 'lower' = 'lowerM' = 'lowerYoneda'
+-- @
+lowerM :: Monad f => Yoneda f a -> f a
+lowerM (Yoneda f m) = liftM f m
+{-# INLINE lowerM #-}
