diff --git a/Control/Monad/Codensity.hs b/Control/Monad/Codensity.hs
--- a/Control/Monad/Codensity.hs
+++ b/Control/Monad/Codensity.hs
@@ -15,12 +15,14 @@
   , lowerCodensity
   , codensityToAdjunction
   , adjunctionToCodensity
+  , improve
   ) where
 
 import Control.Applicative
 import Control.Monad.Reader.Class
 import Control.Monad.State.Class
 import Control.Monad.Free.Class
+import Control.Monad.Free
 import Control.Monad (ap, MonadPlus(..))
 import Data.Functor.Adjunction
 import Data.Functor.Apply
@@ -56,7 +58,7 @@
 instance MonadPlus v => MonadPlus (Codensity v) where
   mzero                             = Codensity (\_ -> mzero)
   Codensity m `mplus` Codensity n = Codensity (\k -> m k `mplus` n k)
- 
+
 lowerCodensity :: Monad m => Codensity m a -> m a
 lowerCodensity a = runCodensity a return
 
@@ -72,4 +74,10 @@
 instance MonadReader r m => MonadState r (Codensity m) where
   get = Codensity (ask >>=)
   put s = Codensity (\k -> local (const s) (k ()))
+
+-- | Right associate all binds in a computation that generates a free monad
+-- This can improve the asymptotic efficiency of the result, while preserving
+-- semantics.
+improve :: Functor f => (forall m. MonadFree f m => m a) -> Free f a
+improve m = lowerCodensity m
 
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:       0.5.0
+version:       0.5.1
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
