diff --git a/Data/Generics/PlateData.hs b/Data/Generics/PlateData.hs
--- a/Data/Generics/PlateData.hs
+++ b/Data/Generics/PlateData.hs
@@ -115,7 +115,7 @@
 fromCC (a, b) = (a [], \i -> fst (b i))
 
 
-collect_generate_self :: (Data on, Uniplate with, Typeable on, Typeable with) =>
+collect_generate_self :: (Data on, Data with, Typeable on, Typeable with) =>
                          (forall a . Typeable a => a -> Answer with) -> on -> CC with on
 collect_generate_self oracle x = res
         where
@@ -125,7 +125,7 @@
                        Miss -> (id, \res -> (x,res))
 
 
-collect_generate :: (Data on, Uniplate with, Typeable on, Typeable with) =>
+collect_generate :: (Data on, Data with, Typeable on, Typeable with) =>
                     (forall a . Typeable a => a -> Answer with) -> on -> CC with on
 collect_generate oracle item = fromC $ gfoldl combine create item
     where
diff --git a/Data/Generics/PlateDirect.hs b/Data/Generics/PlateDirect.hs
--- a/Data/Generics/PlateDirect.hs
+++ b/Data/Generics/PlateDirect.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MultiParamTypeClasses, UndecidableInstances #-}
+{-# LANGUAGE MultiParamTypeClasses, UndecidableInstances, FlexibleInstances #-}
 
 {- |
     This module supplies a method for writing 'Biplate' instances more easily.
diff --git a/Data/Generics/Uniplate.hs b/Data/Generics/Uniplate.hs
--- a/Data/Generics/Uniplate.hs
+++ b/Data/Generics/Uniplate.hs
@@ -130,7 +130,8 @@
            | (pre,b:post) <- zip (inits xs) (tails xs)
            , (y, context) <- contexts b]
 
--- | Perform a fold on each value
-fold :: Uniplate on => (on -> [r] -> r) -> on -> r
-fold op x = op x $ map (fold op) $ children x
+-- | Perform a fold-like computation on each value,
+--   technically a paramorphism
+para :: Uniplate on => (on -> [r] -> r) -> on -> r
+para op x = op x $ map (para op) $ children x
 
diff --git a/Data/Generics/UniplateOn.hs b/Data/Generics/UniplateOn.hs
--- a/Data/Generics/UniplateOn.hs
+++ b/Data/Generics/UniplateOn.hs
@@ -83,3 +83,18 @@
         
         f pre x post = [(cur, \new -> generate (pre ++ [new] ++ post))
                        | (cur,gen) <- contexts x]
+
+
+-- * Helper for writing instances
+
+
+-- | Used for defining instances @UniplateFoo a => UniplateFoo [a]@
+uniplateOnList :: BiplateType a b -> BiplateType [a] b
+uniplateOnList f [] = ([], \[] -> [])
+uniplateOnList f (x:xs) =
+        (a ++ as,
+        \ns -> let (n1,n2) = splitAt (length a) ns in b n1 : bs n2)
+    where
+        (a , b ) = f x
+        (as, bs) = uniplateOnList f xs
+
diff --git a/uniplate.cabal b/uniplate.cabal
--- a/uniplate.cabal
+++ b/uniplate.cabal
@@ -1,9 +1,9 @@
+Cabal-Version:      >= 1.2
 Name:               uniplate
-Version:            1.0
+Version:            1.0.1
 Copyright:          2006-7, Neil Mitchell
 Maintainer:         ndmitchell@gmail.com
 Homepage:           http://www-users.cs.york.ac.uk/~ndm/uniplate/
-Build-Depends:      base, mtl
 License:            BSD3
 License-File:       LICENSE
 Author:             Neil Mitchell
@@ -13,14 +13,25 @@
     original Scrap Your Boilerplate work. It requires few extensions to
     Haskell.
 Category:           Development
-Extensions:         CPP
 Extra-Source-Files:
     uniplate.htm
-Exposed-modules:
-    Data.Generics.Uniplate
-    Data.Generics.UniplateOn
-    Data.Generics.Biplate
-    Data.Generics.PlateDirect
-    Data.Generics.PlateTypeable
-    Data.Generics.PlateData
-    Data.Generics.PlateInternal
+
+Flag splitBase
+    Description: Choose the new smaller, split-up base package.
+
+Library
+    if flag(splitBase)
+        build-depends: base >= 3, mtl, containers
+    else
+        build-depends: base < 3, mtl
+
+    Exposed-modules:
+        Data.Generics.Uniplate
+        Data.Generics.UniplateOn
+        Data.Generics.Biplate
+        Data.Generics.PlateDirect
+        Data.Generics.PlateTypeable
+        Data.Generics.PlateData
+        Data.Generics.PlateInternal
+
+    Extensions:     CPP, FlexibleInstances
diff --git a/uniplate.htm b/uniplate.htm
--- a/uniplate.htm
+++ b/uniplate.htm
@@ -56,10 +56,10 @@
 </p>
 
 <p style="margin-left:10%;margin-right:10%;margin-bottom:25px;text-align:justify;">
-    Generic transformations and queries are often referred to as boilerplate code - they remain relatively similar as the action performed by the code changes, and can often outnumber the actual intent of the code in terms of lines. While other generic traversal schemes have shown how powerful new features can be added to compilers, and how the type system can be manipulated into accepting these operations, this document focuses on a conceptually simpler generic concept. The <i>Uniplate</i> class is introduced, which abstracts over common traversals and queries in a simple manner. A more complete document on the Uniplate class will be available from the <a href="http://www-users.cs.york.ac.uk/~ndm/uniplate/">project website</a> shortly.
+    Generic transformations and queries are often referred to as boilerplate code - they remain relatively similar as the action performed by the code changes, and can often outnumber the actual intent of the code in terms of lines. While other generic traversal schemes have shown how powerful new features can be added to compilers, and how the type system can be manipulated into accepting these operations, this document focuses on a conceptually simpler generic concept. The <i>Uniplate</i> class is introduced, which abstracts over common traversals and queries in a simple manner. A more complete document on the Uniplate class was published at the Haskell Workshop 2007, and is available from the <a href="http://www-users.cs.york.ac.uk/~ndm/uniplate/">project website</a>, along with a video presentation.
 </p>
 <p>
-    There have been several attempts at generic traversal/query methods in Haskell. One initial paper was <a href="http://doi.acm.org/10.1145/604174.604179">"Scrap your boilerplate: a practical design pattern for generic programming"</a> (<a href="http://www.cs.vu.nl/boilerplate/tldi03.pdf">free copy</a>) - which I will refer to as SYB. Another mechanism is <a href="http://doi.acm.org/10.1145/1159803.1159834">"A Pattern for Almost Compositional Functions"</a> (<a href="http://www.cs.chalmers.se/~bringert/publ/composOp/composOp.pdf">free copy</a>) - which I refer to as Compos (after the name of their class). A detailed comparison is given in the Uniplate paper (to be submitted).
+    There have been several attempts at generic traversal/query methods in Haskell. One initial paper was <a href="http://doi.acm.org/10.1145/604174.604179">"Scrap your boilerplate: a practical design pattern for generic programming"</a> (<a href="http://www.cs.vu.nl/boilerplate/tldi03.pdf">free copy</a>) - which I will refer to as SYB. Another mechanism is <a href="http://doi.acm.org/10.1145/1159803.1159834">"A Pattern for Almost Compositional Functions"</a> (<a href="http://www.cs.chalmers.se/~bringert/publ/composOp/composOp.pdf">free copy</a>) - which I refer to as Compos (after the name of their class). A detailed comparison is given in the Uniplate paper.
 </p>
 <p>
     The principle advantage of the Uniplate class over these two papers is that it requires no type system extensions, compared to rank-2 types for SYB and GADT's for Compos. The simplicity of the types required means that the user is free to concentrate on the operations within the class, without requiring thought as to the type trickery required. The Uniplate pattern has been implemented in <a href="http://haskell.org/haskellwiki/Yhc">Yhc</a> for the Core data type, and in <a href="http://www-users.cs.york.ac.uk/~ndm/catch/">Catch</a> on several data types within the program.
@@ -73,7 +73,7 @@
     <li>Extensions to Biplate</li>
 </ol>
 <p>
-    The libraries is available through <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/uniplate-1.0">Hackage</a> or darcs:
+    The libraries is available through <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/uniplate">Hackage</a> or darcs:
 </p>
 <pre>
 darcs get --partial <a href="http://www.cs.york.ac.uk/fp/darcs/uniplate">http://www.cs.york.ac.uk/fp/darcs/uniplate</a>
@@ -184,17 +184,17 @@
 <h3>Depth of an expression</h3>
 
 <pre class="define">
-fold :: Uniplate on => (on -> [res] -> res) -> on -> res
+para :: Uniplate on => (on -> [res] -> res) -> on -> res
 </pre>
 <p>
     Now lets imagine that programmers in your language are paid by the depth of expression they produce, so lets write a function that computes the maximum depth of an expression.
 </p>
 <pre>
 depth :: Expr -> Int
-depth = fold (\_ cs -> 1 + maximum (0:cs))
+depth = para (\_ cs -> 1 + maximum (0:cs))
 </pre>
 <p>
-    This function performs a fold over the data structure. The function simply says that for each iteration, add one to the previous depth.  An evaluator for this expression language can also be modelled as a <tt>fold</tt>, see inside the example directory to see an implementation.
+    This function performs a paramorphism (a bit like a fold) over the data structure. The function simply says that for each iteration, add one to the previous depth.  An evaluator for this expression language can also be modelled as a <tt>para</tt>, see inside the example directory to see an implementation.
 </p>
 <p>
     <i>Exercise:</i> Write a function that counts the maximum depth of addition only.
@@ -304,7 +304,7 @@
     biplate :: on -> ([with], [with] -> on)
 </pre>
 <p>
-    The <tt>biplate</tt> method operates much like the <tt>biplate</tt>, except for the different types.  When the types of <tt>on</tt> and <tt>with</tt> are different, <tt>biplate</tt> returns the closest children of the requested type. When the types are the same, this function returns the root element, not it's children.
+    The <tt>biplate</tt> method operates much like <tt>uniplate</tt>, except for the different types.  When the types of <tt>on</tt> and <tt>with</tt> are different, <tt>biplate</tt> returns the closest children of the requested type. When the types are the same, this function returns the root element, not it's children.
 </p>
 <p>
     There are several mechanisms for writing <tt>Biplate</tt> instances, discussed in the Uniplate paper.
