diff --git a/Data/Aeson/Transform.hs b/Data/Aeson/Transform.hs
--- a/Data/Aeson/Transform.hs
+++ b/Data/Aeson/Transform.hs
@@ -3,10 +3,16 @@
     -- * Example usage
     -- $use
 
-    -- * Transformation builder
-    Builder(..)
-    -- * Executing transformation
-  , transform
+    -- * Transformations
+    Builder
+  , at
+  , attr
+  , keep
+  , Data.Aeson.Transform.map
+  , Data.Aeson.Transform.index
+  , atIndex
+  , obj
+  , merge
   ) where
 
 import Data.Aeson as A
@@ -14,95 +20,101 @@
 import qualified Data.Vector as Vec
 import qualified Data.HashMap.Strict as H
 
--- | Transformations are specified by creating 'Builder' instances.
--- Builders specify how to navigate through input JSON and construct
--- output at various nodes in the tree.
---
-data Builder =
-    Id                  -- ^ Pass input directly as output
-  | At Text Builder     -- ^ Move to value in current object
-  | Attr Text           -- ^ Get value in current object
-  | Keep [Text]         -- ^ Filter current object by keys
-  | Map Builder         -- ^ Map over input array
-  | Index Int           -- ^ Get value at index of current array
-  | AtIndex Int Builder -- ^ Move to index in current array
-  | Obj (H.HashMap Text Builder) -- ^ Produce object with given keys
-  | Merge Builder Builder  -- ^ Combine two objects
+type Builder = Value -> Value
 
+-- | Move to value in current object
+at :: Text -> Builder -> Builder
+at k b (A.Object o) = b (o H.! k)
+at _ _ _ = error "Expecting object (at)"
 
--- | Generates new Aeson 'Value' guided by a 'Builder'
---
-transform :: Builder -> Value       -> Value
-transform Id            x            = x
-transform (At k b)      (A.Object o) = transform b $ o H.! k
-transform (At _ _)      _            = error "Expecting object (At)"
-transform (AtIndex i b) (Array a)    = transform b $ a Vec.! i
-transform (AtIndex _ _) _            = error "Expecting array (AtIndex)"
-transform (Index i)     (Array a)    = a Vec.! i
-transform (Index _)     _            = error "Expecting array (Index)"
-transform (Map b)       (Array a)    = Array $ Vec.map (transform b) a
-transform (Map _)       _            = error "Expecting array (Map)"
-transform (Attr k)      (A.Object o) = o H.! k
-transform (Attr _)      _            = error "Expecting object (Keep)"
-transform (Keep ks)     (A.Object o) = A.Object $ H.filterWithKey (const . (`elem` ks)) o
-transform (Keep _)      _            = error "Expecting object (Keep)"
-transform (Obj fs)      x            = A.Object $ H.map (`transform` x) fs
-transform (Merge a b)   x            = case (transform a x, transform b x) of
-                                       (Object c, Object d) -> Object $ H.union c d
-                                       _ -> error "Expected two objects (Merge)"
+-- | Get value in current object
+attr :: Text -> Builder
+attr k (A.Object o) = o H.! k
+attr _ _ = error "Expecting object (attr)"
 
+-- | Filter current object by keys
+keep :: [Text] -> Builder
+keep ks (A.Object o) = A.Object $ H.filterWithKey (const . (`elem` ks)) o
+keep _ _ = error "Expecting object (keep)"
+
+-- | Map over input array
+map :: Builder -> Builder
+map b (Array a) = Array $ Vec.map b a
+map _ _ = error "Expecting array (map)"
+
+-- | Get value at index of current array
+index :: Int -> Builder
+index i (Array a) = a Vec.! i
+index _ _ = error "Expecting array (index)"
+
+-- | Move to index in current array
+atIndex :: Int -> Builder -> Builder
+atIndex i b (Array a) = b $ a Vec.! i
+atIndex _ _ _ = error "Expecting array (atIndex)"
+
+-- | Produce object with given keys
+obj :: H.HashMap Text Builder -> Builder
+obj h x = A.Object $ H.map (\b -> b x) h
+
+-- | Combine two objects
+merge :: Builder -> Builder -> Builder
+merge a b val = case (a val, b val) of
+                  (Object c, Object d) -> Object $ H.union c d
+                  _ -> error "Expected two objects (merge)"
+
+
 -- $use
 --
 -- Filter unwanted attributes from an object
 --
--- > Keep ["nice", "good"]
+-- > keep ["nice", "good"]
 -- >
 -- > -- { bad: 3, good: 1, nice: 500, evil: -3 }
 -- > -- => { good: 1, nice: 500 }
 --
 -- Grab value
 --
--- > Attr "foo"
+-- > attr "foo"
 -- >
 -- > -- { foo: 2 } => 2
 --
 -- Dig deeper
 --
--- > At "foo" $ Attr "bar"
+-- > at "foo" $ attr "bar"
 -- >
 -- > -- { foo: { bar: 3 }} => 3
 --
 -- Map stuff
 --
--- > Map $ Attr "foo"
+-- > map $ attr "foo"
 -- >
 -- > -- [{ foo:1 }, { foo:2 }] => [1, 2]
 --
 -- Extract indices
 --
--- > Map $ Index 0
+-- > map $ index 0
 -- >
 -- > -- [[1,2], [3,4]] => [1, 3]
 --
 -- Create object
 --
--- > Obj $ fromList [
--- >     ("first", Index 0)
--- >   , ("second", Index 1)
+-- > obj $ fromList [
+-- >     ("first", index 0)
+-- >   , ("second", index 1)
 -- >   ]
 -- >
 -- > -- ["hi", "bye"] => { first:"hi", second:"bye" }
 --
 -- Transform position
 --
--- > At "ranks" $ AtIndex 0 $ Attr "name"
+-- > at "ranks" $ atIndex 0 $ attr "name"
 -- >
--- > -- {ranks: [ { name:"winner", score:12 }, { name:"Loser", score: 3 ]}
+-- > -- {ranks: [ { name:"winner", score:12 }, { name:"loser", score: 3 ]}
 -- > -- => "winner"
 --
 -- Combine objects
 --
--- > Merge (Attr "foo") (Attr "bar")
+-- > merge (attr "foo") (attr "bar")
 -- >
 -- > -- { foo: { a:1, b:2 }, bar: { b:3, c:4 } }
 -- > -- => { a:1, b:2, c:4 }
diff --git a/aeson-t.cabal b/aeson-t.cabal
--- a/aeson-t.cabal
+++ b/aeson-t.cabal
@@ -1,5 +1,5 @@
 Name:                   aeson-t
-Version:                0.0.3
+Version:                0.0.4
 Author:                 Joe Nelson <cred+github@begriffs.com>
 Maintainer:             Joe Nelson <cred+github@begriffs.com>
 Category:               Data
