diff --git a/lgtk.cabal b/lgtk.cabal
--- a/lgtk.cabal
+++ b/lgtk.cabal
@@ -1,5 +1,5 @@
 name:               lgtk
-version:            0.3
+version:            0.3.1
 category:           GUI
 synopsis:           lens-based GUI with Gtk backend
 description:
diff --git a/src/Control/MLens.hs b/src/Control/MLens.hs
--- a/src/Control/MLens.hs
+++ b/src/Control/MLens.hs
@@ -9,6 +9,7 @@
 
     -- * Lens operations
     , getL, setL, modL
+    , readRef, writeRef, modRef
 
     -- * Lens transformations
     , fromLens, toLens
@@ -18,7 +19,14 @@
     , joinML, joinLens
     , memoMLens
 
-    -- * Pure lenses
+    -- * Lens creation
+    , lens
+    , NewRef (..)
+    , ExtRef (..)
+    , Ext, runExt, runExt_
+
+    -- * Derived constructs
+    -- ** Pure lenses, built with @lens@
     , id
     , unitLens
     , fstLens, sndLens
@@ -26,17 +34,12 @@
     , listLens
     , ithLens
 
-    -- * Impure lenses
-    , lens
+    -- ** Impure lenses, built with @lens@
     , forkLens
     , justLens
     , showLens
 
-    -- * Reference operations
-    , readRef, writeRef, modRef
-    , NewRef (..)
-    , ExtRef (..)
-    , Ext, runExt, runExt_
+    -- ** Other derived construts
     , undoTr
 
     -- * Auxiliary definitions
diff --git a/src/Data/MLens.hs b/src/Data/MLens.hs
--- a/src/Data/MLens.hs
+++ b/src/Data/MLens.hs
@@ -155,10 +155,10 @@
 unitLens = lens (const ()) (const id)
 
 fstLens :: Monad m => MLens m (a,b) a
-fstLens = MLens $ \(a,b) -> return (a, \a' -> return (a', b))
+fstLens = lens fst $ \a (_,b) -> (a,b)
 
 sndLens :: Monad m => MLens m (a,b) b
-sndLens = MLens $ \(a,b) -> return (b, \b' -> return (a, b'))
+sndLens = lens snd $ \b (a,_) -> (a,b)
 
 maybeLens :: Monad m => MLens m (Bool, a) (Maybe a)
 maybeLens = lens (\(b,a) -> if b then Just a else Nothing)
@@ -176,8 +176,7 @@
 ithLens i = lens (!!i) $ \x xs -> take i xs ++ x : drop (i+1) xs
 
 forkLens :: (Monoid a, Monad m) => MLens m a (a, a)
-forkLens = MLens $ \a ->
-    return ((a, a), \(a1, a2) -> return $ a1 `mappend` a2)
+forkLens = lens (\a -> (a, a)) $ \(a1, a2) _ -> a1 `mappend` a2
 
 justLens :: Monad m => a -> MLens m (Maybe a) a
 justLens a = lens (maybe a id) (const . Just)
diff --git a/src/Data/MLens/Ref.hs b/src/Data/MLens/Ref.hs
--- a/src/Data/MLens/Ref.hs
+++ b/src/Data/MLens/Ref.hs
@@ -25,8 +25,8 @@
 
 {- | 
 The abstract data type @Unit@ is isomorphic to @()@,
-but by making it abstract we can prevent using references
-on the left hand side of lens composition.
+but by making it abstract we can prevent using the same reference
+on both sides of lens composition, which would have surprising effects.
 -}
 data Unit = Unit deriving (Eq, Show)
 
@@ -54,7 +54,7 @@
 -}
 type Ref m a = MLens m Unit a
 
-readRef :: Monad m => MLens m Unit a -> m a
+readRef :: Monad m => Ref m a -> m a
 readRef k = getL k Unit
 
 writeRef :: Monad m => Ref m a -> a -> m ()
diff --git a/src/GUI/MLens/Gtk.hs b/src/GUI/MLens/Gtk.hs
--- a/src/GUI/MLens/Gtk.hs
+++ b/src/GUI/MLens/Gtk.hs
@@ -8,12 +8,14 @@
     -- * GUI combinators
     , I (..)
     , ListLayout (..)
-    , vcat, hcat
-    , smartButton
 
     -- * Running GUI descriptions
     , runI
     , unsafeRunI
+
+    -- * Derived constructs
+    , vcat, hcat
+    , smartButton
 
     -- * Auxiliary functions
     , toFree
