diff --git a/operational-class.cabal b/operational-class.cabal
--- a/operational-class.cabal
+++ b/operational-class.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                operational-class
-version:             0.2.0.2
+version:             0.3.0.0
 synopsis:            MonadProgram typeclass for the operational package
 -- description:
 homepage:            https://github.com/srijs/haskell-operational-class
diff --git a/src/Control/Monad/Operational/Class.hs b/src/Control/Monad/Operational/Class.hs
--- a/src/Control/Monad/Operational/Class.hs
+++ b/src/Control/Monad/Operational/Class.hs
@@ -4,7 +4,6 @@
 
 import Data.Monoid (Monoid)
 
-import Control.Monad (liftM, join)
 import qualified Control.Monad.Operational as Operational
 import Control.Monad.Trans.Class (MonadTrans, lift)
 
@@ -21,51 +20,46 @@
 import Control.Monad.Trans.List (ListT)
 
 class Monad m => MonadProgram instr m | m -> instr where
-  wrap :: Operational.Program instr (m a) -> m a
-
-wrapT :: (m ~ t n, Monad m, MonadTrans t, MonadProgram instr n) => Operational.Program instr (m a) -> m a
-wrapT = join . lift . wrap . fmap return
+  liftProgram :: Operational.Program instr a -> m a
 
-liftProgram :: MonadProgram instr m => Operational.Program instr a -> m a
-liftProgram p = wrap $ liftM return p
+liftProgramTrans :: (Monad (t n), MonadTrans t, MonadProgram instr n) => Operational.Program instr a -> t n a
+liftProgramTrans = lift . liftProgram
 
 singleton :: MonadProgram instr m => instr a -> m a
 singleton = liftProgram . Operational.singleton
 
 instance Monad m => MonadProgram instr (Operational.ProgramT instr m) where
-  wrap = eval . Operational.view
-    where eval (Operational.Return a) = a
-          eval (i Operational.:>>= k) = Operational.singleton i >>= wrap . k
+  liftProgram = Operational.liftProgram
 
 instance (MonadProgram instr m) => MonadProgram instr (ReaderT e m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (Strict.StateT s m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (Lazy.StateT s m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (ContT r m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m, Monoid w) => MonadProgram instr (Strict.WriterT w m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m, Monoid w) => MonadProgram instr (Lazy.WriterT w m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m, Monoid w) => MonadProgram instr (Strict.RWST r w s m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m, Monoid w) => MonadProgram instr (Lazy.RWST r w s m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (MaybeT m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (IdentityT m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
 
 instance (MonadProgram instr m) => MonadProgram instr (ListT m) where
-  wrap = wrapT
+  liftProgram = liftProgramTrans
