diff --git a/Control/Monad/Operational/Mini.hs b/Control/Monad/Operational/Mini.hs
--- a/Control/Monad/Operational/Mini.hs
+++ b/Control/Monad/Operational/Mini.hs
@@ -21,9 +21,10 @@
 
 import Control.Monad.Operational.Class
 import Control.Monad.Operational.TH
-import Control.Applicative
 import Data.OpenUnion1.Clean
 import Control.Elevator
+import Control.Applicative
+import Data.Functor.Identity
 
 infixl 1 :>>=
 
@@ -50,8 +51,8 @@
 cloneProgram (Program m) = m return ((>>=) . elevate)
 
 instance Tower (Program t) where
-    type Floors (Program t) = t :> ReifiedProgram t :> Empty
-    toLoft = (\t -> Program $ \p i -> i t p) ||> fromReified ||> exhaust
+    type Floors (Program t) = t :> ReifiedProgram t :> Identity :> Empty
+    toLoft = (\t -> Program $ \p i -> i t p) ||> fromReified ||> pure . runIdentity ||> exhaust
 
 -- | Reified version of 'Program'. It is useful for testing.
 data ReifiedProgram t a where
@@ -82,5 +83,5 @@
     (t :>>= m) >>= k = t :>>= (>>= k) . m
 
 instance Tower (ReifiedProgram t) where
-    type Floors (ReifiedProgram t) = t :> Program t :> Empty
-    toLoft = (:>>= Return) ||> cloneProgram ||> exhaust
+    type Floors (ReifiedProgram t) = t :> Program t :> Identity :> Empty
+    toLoft = (:>>= Return) ||> (\(Program m) -> m Return (:>>=)) ||> pure . runIdentity ||> exhaust
diff --git a/Control/Monad/Trans/Operational/Mini.hs b/Control/Monad/Trans/Operational/Mini.hs
--- a/Control/Monad/Trans/Operational/Mini.hs
+++ b/Control/Monad/Trans/Operational/Mini.hs
@@ -67,8 +67,8 @@
       :> Floors1 m
     toLoft = (\t -> ProgramT $ \p _ i -> i t p)
       ||> fromReifiedT
-      ||> P.cloneProgram
-      ||> P.cloneProgram . P.fromReified
+      ||> (\(P.Program m) -> ProgramT $ \r _ b -> m r b) 
+      ||> (\(P.Program m) -> ProgramT $ \r _ b -> m r b) . P.fromReified
       ||> lift . toLoft1
 
 instance MonadTrans (ProgramT t) where
@@ -125,9 +125,9 @@
       :> P.ReifiedProgram t
       :> Floors1 m
     toLoft = (:>>= Return)
-      ||> cloneProgramT
-      ||> P.cloneProgram
-      ||> P.cloneProgram . P.fromReified
+      ||> (\(ProgramT m) -> m Return (flip Lift id) (:>>=))
+      ||> (\(P.Program m) -> m Return (:>>=))
+      ||> (\(P.Program m) -> m Return (:>>=)) . P.fromReified
       ||> lift . toLoft1
 
 instance MonadTrans (ReifiedProgramT t) where lift = flip Lift Return
diff --git a/minioperational.cabal b/minioperational.cabal
--- a/minioperational.cabal
+++ b/minioperational.cabal
@@ -1,5 +1,5 @@
 name:                minioperational
-version:             0.4.8
+version:             0.4.8.1
 synopsis:            fast and simple operational monad
 description:         This package provides tiny implementation of operational monad.
 homepage:            https://github.com/fumieval/minioperational
