diff --git a/order-maintenance.cabal b/order-maintenance.cabal
--- a/order-maintenance.cabal
+++ b/order-maintenance.cabal
@@ -1,5 +1,5 @@
 Name:          order-maintenance
-Version:       0.2.0.0
+Version:       0.2.1.0
 Cabal-Version: >= 1.16
 Build-Type:    Simple
 License:       BSD3
@@ -9,7 +9,7 @@
 Maintainer:    wolfgang-it@jeltsch.info
 Stability:     provisional
 Homepage:      http://hackage.haskell.org/package/order-maintenance
-Package-URL:   http://hackage.haskell.org/packages/archive/order-maintenance/0.2.0.0/order-maintenance-0.2.0.0.tar.gz
+Package-URL:   http://hackage.haskell.org/package/order-maintenance-0.2.1.0/order-maintenance-0.2.1.0.tar.gz
 Synopsis:      Algorithms for the order maintenance problem with a safe
                interface
 Description:   This package is about order maintenance.
@@ -25,7 +25,7 @@
 
     Type:     darcs
     Location: http://hub.darcs.net/jeltsch/order-maintenance
-    Tag:      order-maintenance-0.2.0.0
+    Tag:      order-maintenance-0.2.1.0
 
 Library
 
@@ -39,6 +39,7 @@
                         GeneralizedNewtypeDeriving
                         KindSignatures
                         Rank2Types
+                        TupleSections
 
     Exposed-Modules: Control.Monad.Trans.Order
                      Control.Monad.Trans.Order.Lazy
@@ -75,7 +76,7 @@
                    containers            >= 0.5  && < 0.6,
                    QuickCheck            >= 2.6  && < 3,
                    transformers          >= 0.3  && < 0.6,
-                   order-maintenance     == 0.2.0.0
+                   order-maintenance     == 0.2.1.0
 
     Default-Language: Haskell2010
 
diff --git a/src/library/Control/Monad/Trans/Order/Lazy.hs b/src/library/Control/Monad/Trans/Order/Lazy.hs
--- a/src/library/Control/Monad/Trans/Order/Lazy.hs
+++ b/src/library/Control/Monad/Trans/Order/Lazy.hs
@@ -10,6 +10,7 @@
     OrderT,
     performT,
     getOrderToken,
+    lift,
 
     -- * Element creation
 
@@ -66,6 +67,13 @@
 
 getOrderToken :: Applicative f => OrderT o f ()
 getOrderToken = OrderT $ OrderTRep.getOrderToken
+
+lift :: Functor f => f a -> OrderT o f a
+lift struct = OrderT $ OrderTRep.lift struct
+{-NOTE:
+    This version is more general than the one from MonadTrans, since it works
+    with arbitrary functors, not just monads.
+-}
 
 -- * Element creation
 
diff --git a/src/library/Control/Monad/Trans/Order/Lazy/Type.hs b/src/library/Control/Monad/Trans/Order/Lazy/Type.hs
--- a/src/library/Control/Monad/Trans/Order/Lazy/Type.hs
+++ b/src/library/Control/Monad/Trans/Order/Lazy/Type.hs
@@ -10,7 +10,7 @@
 import           Control.Monad.Trans.Class
 import           Control.Monad.IO.Class
 import qualified Control.Monad.Trans.State.Lazy as Lazy
-import           Control.Monad.Trans.Order.Representation
+import           Control.Monad.Trans.Order.Representation hiding (lift)
 
 newtype OrderT o m a = OrderT {
             runOrderT :: OrderTRep Lazy.StateT o m a
diff --git a/src/library/Control/Monad/Trans/Order/Representation.hs b/src/library/Control/Monad/Trans/Order/Representation.hs
--- a/src/library/Control/Monad/Trans/Order/Representation.hs
+++ b/src/library/Control/Monad/Trans/Order/Representation.hs
@@ -5,6 +5,7 @@
     OrderTRep (OrderTRep),
     performT,
     getOrderToken,
+    lift,
 
     -- * Element creation
 
@@ -22,11 +23,12 @@
 
 -- Control
 
-import Control.Applicative
-import Control.Monad
-import Control.Monad.Fix
-import Control.Monad.Trans.Class
-import Control.Monad.IO.Class
+import           Control.Applicative
+import           Control.Monad
+import           Control.Monad.Fix
+import           Control.Monad.Trans.Class (MonadTrans)
+import qualified Control.Monad.Trans.Class (lift)
+import           Control.Monad.IO.Class
 
 -- Data
 
@@ -130,6 +132,13 @@
 
 getOrderToken :: (StateMonadTrans t, Applicative f) => OrderTRep t o f ()
 getOrderToken = OrderTRep $ state $ \ orderRep -> (orderRep `seq` (), orderRep)
+
+lift :: (StateMonadTrans t, Functor f) => f a -> OrderTRep t o f a
+lift struct = OrderTRep $ stateT $ \ orderRep -> (, orderRep) <$> struct
+{-NOTE:
+    This version is more general than the one from MonadTrans, since it works
+    with arbitrary functors, not just monads.
+-}
 
 -- * Element creation
 
diff --git a/src/library/Control/Monad/Trans/Order/Strict.hs b/src/library/Control/Monad/Trans/Order/Strict.hs
--- a/src/library/Control/Monad/Trans/Order/Strict.hs
+++ b/src/library/Control/Monad/Trans/Order/Strict.hs
@@ -30,7 +30,8 @@
 import           Control.Applicative
 import           Control.Monad
 import           Control.Monad.Fix
-import           Control.Monad.Trans.Class
+import           Control.Monad.Trans.Class (MonadTrans)
+import qualified Control.Monad.Trans.Class as Trans (lift)
 import           Control.Monad.IO.Class
 import qualified Control.Monad.Trans.State.Strict as Strict
 import           Control.Monad.Trans.Order.Representation
@@ -135,7 +136,7 @@
 
     -- MonadTrans
 
-    lift' = lift
+    lift' = Trans.lift
 
     -- MonadIO
 
@@ -151,6 +152,13 @@
 
 getOrderToken :: Applicative f => OrderT o f ()
 getOrderToken = OrderT $ OrderTRep.getOrderToken
+
+lift :: Functor f => f a -> OrderT o f a
+lift struct = OrderT $ OrderTRep.lift struct
+{-NOTE:
+    This version is more general than the one from MonadTrans, since it works
+    with arbitrary functors, not just monads.
+-}
 
 -- * Element creation
 
diff --git a/src/library/Data/Order/Pair.hs b/src/library/Data/Order/Pair.hs
--- a/src/library/Data/Order/Pair.hs
+++ b/src/library/Data/Order/Pair.hs
@@ -1,9 +1,9 @@
 module Data.Order.Pair (
 
     OrderPair,
-    empty,
-    emptyBy,
-    companion
+    emptyOrderPair,
+    emptyOrderPairUsing,
+    withoutOrder
 
 ) where
 
@@ -25,15 +25,17 @@
 
 -- NOTE: OrderPair is imported from Data.Order.Pair.Type.
 
-empty :: OrderPair o ()
-empty = emptyBy defaultAlgorithm
+emptyOrderPair :: a -> OrderPair o a
+emptyOrderPair = emptyOrderPairUsing defaultAlgorithm
 
-emptyBy :: Algorithm -> OrderPair o ()
-emptyBy (Algorithm rawAlg) = OrderPair ((), emptyOrderRepBy rawAlg)
+emptyOrderPairUsing :: Algorithm -> a -> OrderPair o a
+emptyOrderPairUsing (Algorithm rawAlg) val = orderPair where
 
-{-# NOINLINE emptyOrderRepBy #-}
-emptyOrderRepBy :: RawAlgorithm RealWorld o e -> OrderRep o e
-emptyOrderRepBy rawAlg = unsafePerformIO $ newOrderRep rawAlg
+    orderPair = OrderPair (val, emptyOrderRepUsing rawAlg)
 
-companion :: (forall o . OrderPair o a) -> a
-companion (OrderPair (comp, _)) = comp
+{-# NOINLINE emptyOrderRepUsing #-}
+emptyOrderRepUsing :: RawAlgorithm RealWorld o e -> OrderRep o e
+emptyOrderRepUsing rawAlg = unsafePerformIO $ newOrderRep rawAlg
+
+withoutOrder :: (forall o . OrderPair o a) -> a
+withoutOrder (OrderPair (comp, _)) = comp
diff --git a/src/library/Data/Order/Pair/Type.hs b/src/library/Data/Order/Pair/Type.hs
--- a/src/library/Data/Order/Pair/Type.hs
+++ b/src/library/Data/Order/Pair/Type.hs
@@ -9,3 +9,9 @@
 import Data.Order.Representation
 
 data OrderPair o a = forall o' e' . OrderPair (a, OrderRep o' e')
+
+instance Functor (OrderPair o) where
+
+    fmap fun (OrderPair (val, orderRep)) = OrderPair (fun val, orderRep)
+
+    val <$ OrderPair (_, orderRep) = OrderPair (val, orderRep)
