diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,8 @@
+0.0.5
+
+* Rename `downReader` to `liftReader`.
+* Generalise top-level functions.
+
 0.0.4
 
 * Add `downReader` functions.
diff --git a/reader.cabal b/reader.cabal
--- a/reader.cabal
+++ b/reader.cabal
@@ -1,5 +1,5 @@
 name:                 reader
-version:              0.0.4
+version:              0.0.5
 synopsis:             A reader data type with all the bits
 description:          A reader data type with all the bits and type constructor rearrangements
 license:              BSD3
@@ -21,10 +21,11 @@
 
 library
   exposed-modules:    Data.Reader
-                      Data.Reader.Readers
+                      Data.Reader.Reader
                       Data.Reader.Reader1
                       Data.Reader.Reader2
                       Data.Reader.Reader3
+                      Data.Reader.Readers
 
   build-depends:        base >= 4.8 && < 6
                       , contravariant >= 1 && < 2
diff --git a/src/Data/Reader.hs b/src/Data/Reader.hs
--- a/src/Data/Reader.hs
+++ b/src/Data/Reader.hs
@@ -3,7 +3,8 @@
 
 module Data.Reader( module R ) where
 
-import Data.Reader.Readers as R
+import Data.Reader.Reader as R
 import Data.Reader.Reader1 as R
 import Data.Reader.Reader2 as R
 import Data.Reader.Reader3 as R
+import Data.Reader.Readers as R
diff --git a/src/Data/Reader/Reader.hs b/src/Data/Reader/Reader.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Reader/Reader.hs
@@ -0,0 +1,90 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+
+module Data.Reader.Reader where
+
+import Control.Applicative ( Applicative(pure) )
+import Control.Arrow
+    ( Kleisli(Kleisli) )
+import Control.Category ( Category(..) )
+import Control.Lens
+    ( _Wrapped,
+      over,
+      review,
+      iso,
+      view,
+      Iso,
+      Rewrapped,
+      Wrapped(Unwrapped) )
+import Data.Profunctor ( Star(Star) )
+
+-- |
+--
+-- Iso (Reader a b) (Reader a' b') (a -> b) (a' -> b')
+reader ::
+  (Rewrapped t t, Rewrapped s1 s1, Rewrapped s2 s2, Rewrapped c c, Unwrapped t ~ (a1 -> c), Unwrapped s1 ~ (a2 -> s2)) =>
+  Iso s1 t (a2 -> Unwrapped s2) (a1 -> Unwrapped c)
+reader =
+  iso
+    (\r -> view _Wrapped . view _Wrapped r)
+    (\f -> review _Wrapped (review _Wrapped . f))
+
+-- |
+--
+-- Iso (LensLike f s t a b) (LensLike f' s' t' a' b') (Reader1Lens f s t a b) (Reader1Lens f' s' t' a' b')
+readerLens ::
+  (Rewrapped t1 t1, Rewrapped s1 s1, Rewrapped s2 s2, Rewrapped t2 t2) =>
+  Iso
+    (Unwrapped s1 -> Unwrapped t1)
+    (Unwrapped t2 -> Unwrapped s2)
+    (s1 -> t1)
+    (t2 -> s2)
+readerLens =
+  iso
+    (\k f -> review _Wrapped (k (view _Wrapped f)))
+    (\k f -> view _Wrapped (k (review _Wrapped f)))
+
+-- |
+--
+-- Applicative f => Reader a b -> ReaderT a f b
+pureReader ::
+  (Applicative f, Rewrapped s1 t, Rewrapped t s1, Rewrapped s2 s2, Unwrapped t ~ (a -> f (Unwrapped s2)), Unwrapped s1 ~ (a -> s2)) =>
+  s1
+  -> t
+pureReader =
+  over _Wrapped (\f -> pure . view _Wrapped . f)
+
+-- |
+--
+-- (forall x. f x -> g x) -> ReaderT a f b -> ReaderT a g b
+homReader ::
+  (Rewrapped s t, Rewrapped t s, Category cat, Unwrapped t ~ cat a c, Unwrapped s ~ cat a b) =>
+  cat b c
+  -> s
+  -> t
+homReader f =
+  over _Wrapped (f .)
+
+-- |
+--
+-- Iso (Star f a b) (Star f' a' b') (ReaderT a f b) (ReaderT a' f' b')
+star ::
+  (Rewrapped a a, Rewrapped s s, Unwrapped a ~ (d1 -> f2 c1), Unwrapped s ~ (d2 -> f3 c2)) =>
+  Iso (Star f2 d1 c1) (Star f3 d2 c2) a s
+star =
+  iso
+    (\(Star k) -> review _Wrapped k)
+    (Star . view _Wrapped)
+
+-- |
+--
+-- Iso (Kleisli f a b) (Kleisli f' a' b') (ReaderT a f b) (ReaderT a' f' b')
+kleisli ::
+  (Rewrapped a1 a1, Rewrapped s s, Unwrapped a1 ~ (a2 -> m1 b1), Unwrapped s ~ (a3 -> m2 b2)) =>
+  Iso (Kleisli m1 a2 b1) (Kleisli m2 a3 b2) a1 s
+kleisli =
+  iso
+    (\(Kleisli k) -> review _Wrapped k)
+    (Kleisli . view _Wrapped)
diff --git a/src/Data/Reader/Reader1.hs b/src/Data/Reader/Reader1.hs
--- a/src/Data/Reader/Reader1.hs
+++ b/src/Data/Reader/Reader1.hs
@@ -15,28 +15,29 @@
 , reader1'
 , star1
 , kleisli1
-, downReader1
+, liftReader1
+, pureReader1
 , homReader1
 ) where
 
 import Control.Applicative
     ( Applicative((<*>), pure), Alternative((<|>), empty) )
-import Control.Arrow
-    ( Kleisli(Kleisli) )
+import Control.Arrow ( Kleisli )
 import Control.Category ( Category(..) )
 import Control.Lens
     ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
 import Control.Monad
     ( Monad(return, (>>=)), MonadPlus(..) )
+import qualified Control.Monad.Reader as Reader(ReaderT(ReaderT))
+import Control.Monad.Reader.Class ( MonadReader )
+import qualified Control.Monad.Reader.Class as Reader ( MonadReader(..) )
 import Control.Monad.State.Class ( MonadState(..) )
-import Control.Monad.Reader.Class ( MonadReader(..) )
 import Control.Monad.Writer.Class ( MonadWriter(..) )
 import Control.Monad.Error.Class ( MonadError(..) )
 import Control.Monad.Cont.Class ( MonadCont(..) )
 import Control.Monad.IO.Class ( MonadIO(..) )
 import Control.Monad.Morph
     ( MFunctor(..), MMonad(..) )
-import qualified Control.Monad.Reader as Reader(ReaderT(ReaderT))
 import Control.Monad.Trans.Class ( MonadTrans(..) )
 import Data.Functor ( Functor(fmap) )
 import Data.Functor.Alt ( Alt((<!>)) )
@@ -48,7 +49,9 @@
 import Data.Functor.Identity ( Identity(..) )
 import Data.Functor.Plus ( Plus(..) )
 import Data.Monoid(Monoid(mempty))
-import Data.Profunctor ( Star(Star) )
+import Data.Profunctor ( Star )
+import Data.Reader.Reader
+    ( pureReader, homReader, reader, readerLens, star, kleisli )
 import Data.Semigroup ( Semigroup((<>)) )
 
 newtype Reader1T a f b =
@@ -73,9 +76,7 @@
     (a -> b)
     (a' -> b')
 reader1 =
-  iso
-    (\r -> runIdentity . view _Wrapped r)
-    (\f -> review _Wrapped (Identity . f))
+  reader
 
 type Reader1Lens f s t a b =
   Reader1T a f b
@@ -88,9 +89,7 @@
     (Reader1Lens f s t a b)
     (Reader1Lens f' s' t' a' b')
 reader1Lens =
-  iso
-    (\k f -> Reader1T (k (view _Wrapped f)))
-    (\k f -> view _Wrapped (k (Reader1T f)))
+  readerLens
 
 reader1' ::
   Iso
@@ -110,9 +109,7 @@
     (Reader1T a f b)
     (Reader1T a' f' b')
 star1 =
-  iso
-    (\(Star k) -> Reader1T k)
-    (\(Reader1T k) -> Star k)
+  star
 
 kleisli1 ::
   Iso
@@ -121,27 +118,32 @@
     (Reader1T a f b)
     (Reader1T a' f' b')
 kleisli1 =
-  iso
-    (\(Kleisli k) -> Reader1T k)
-    (\(Reader1T k) -> Kleisli k)
+  kleisli
 
-downReader1 ::
+liftReader1 ::
   Iso
     (Reader1T a f b)
     (Reader1T a' f' b')
     (Reader1 a (f b))
     (Reader1 a' (f' b'))
-downReader1 =
+liftReader1 =
   iso
     (review reader1 . view _Wrapped)
     (review _Wrapped . view reader1)
 
+pureReader1 ::
+  Applicative f =>
+  Reader1 a b
+  -> Reader1T a f b
+pureReader1 =
+  pureReader
+
 homReader1 ::
   (forall x. f x -> g x)
   -> Reader1T a f b
   -> Reader1T a g b
-homReader1 f =
-  over _Wrapped (f .)
+homReader1 =
+  homReader
 
 instance Functor f => Functor (Reader1T a f) where
   fmap f (Reader1T g) =
diff --git a/src/Data/Reader/Reader2.hs b/src/Data/Reader/Reader2.hs
--- a/src/Data/Reader/Reader2.hs
+++ b/src/Data/Reader/Reader2.hs
@@ -16,7 +16,8 @@
 , reader2'
 , star2
 , kleisli2
-, downReader2
+, liftReader2
+, pureReader2
 , homReader2
 ) where
 
@@ -30,20 +31,21 @@
       ArrowApply(..),
       ArrowChoice(..),
       ArrowLoop(..),
-      Kleisli(Kleisli) )
+      Kleisli )
 import Control.Category ( Category(..) )
 import Control.Lens
     ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
 import Control.Monad
     ( Monad(return, (>>=)), sequence, MonadPlus(..), (>=>) )
+import qualified Control.Monad.Reader as Reader(ReaderT(ReaderT))
+import Control.Monad.Reader.Class ( MonadReader )
+import qualified Control.Monad.Reader.Class as Reader ( MonadReader(..) )
 import Control.Monad.State.Class ( MonadState(..) )
-import Control.Monad.Reader.Class ( MonadReader(..) )
 import Control.Monad.Writer.Class ( MonadWriter(..) )
 import Control.Monad.Error.Class ( MonadError(..) )
 import Control.Monad.Fix ( MonadFix(..) )
 import Control.Monad.Cont.Class ( MonadCont(..) )
 import Control.Monad.IO.Class ( MonadIO(..) )
-import qualified Control.Monad.Reader as Reader(ReaderT(ReaderT))
 import Data.Distributive ( Distributive(distribute, collect) )
 import Data.Either ( Either(Right, Left), either )
 import Data.Functor ( Functor(fmap) )
@@ -59,13 +61,14 @@
 import Data.Profunctor
     ( Choice(..),
       Profunctor(dimap),
-      Star(Star),
+      Star,
       Closed(..),
       Costrong(unfirst),
       Strong(..),
       Mapping(..),
       Cochoice(unright) )
 import Data.Profunctor.Traversing ( Traversing(..) )
+import Data.Reader.Reader
 import Data.Semigroup ( Semigroup((<>)) )
 import Data.Semigroupoid ( Semigroupoid(..) )
 import Data.Traversable ( Traversable(traverse) )
@@ -93,9 +96,7 @@
     (a -> b)
     (a' -> b')
 reader2 =
-  iso
-    (\r -> runIdentity . view _Wrapped r)
-    (\f -> review _Wrapped (Identity . f))
+  reader
 
 reader2' ::
   Iso
@@ -119,9 +120,7 @@
     (Reader2Lens f s t a b)
     (Reader2Lens f' s' t' a' b')
 reader2Lens =
-  iso
-    (\k f -> Reader2T (k (view _Wrapped f)))
-    (\k f -> view _Wrapped (k (Reader2T f)))
+  readerLens
 
 star2 ::
   Iso
@@ -130,9 +129,7 @@
     (Reader2T f a b)
     (Reader2T f' a' b')
 star2 =
-  iso
-    (\(Star k) -> Reader2T k)
-    (\(Reader2T k) -> Star k)
+  star
 
 kleisli2 ::
   Iso
@@ -141,27 +138,32 @@
     (Reader2T f a b)
     (Reader2T f' a' b')
 kleisli2 =
-  iso
-    (\(Kleisli k) -> Reader2T k)
-    (\(Reader2T k) -> Kleisli k)
+  kleisli
 
-downReader2 ::
+liftReader2 ::
   Iso
     (Reader2T f a b)
     (Reader2T f' a' b')
     (Reader2 a (f b))
     (Reader2 a' (f' b'))
-downReader2 =
+liftReader2 =
   iso
     (review reader2 . view _Wrapped)
     (review _Wrapped . view reader2)
 
+pureReader2 ::
+  Applicative f =>
+  Reader2 a b
+  -> Reader2T f a b
+pureReader2 =
+  pureReader
+
 homReader2 ::
   (forall x. f x -> g x)
   -> Reader2T f a b
   -> Reader2T g a b
-homReader2 f =
-  over _Wrapped (f .)
+homReader2 =
+  homReader
 
 instance Functor f => Functor (Reader2T f a) where
   fmap f (Reader2T g) =
diff --git a/src/Data/Reader/Reader3.hs b/src/Data/Reader/Reader3.hs
--- a/src/Data/Reader/Reader3.hs
+++ b/src/Data/Reader/Reader3.hs
@@ -15,14 +15,14 @@
 , reader3'
 , star3
 , kleisli3
-, downReader3
+, liftReader3
+, pureReader3
 , homReader3
 ) where
 
 import Control.Applicative
     ( Applicative(pure), liftA2 )
-import Control.Arrow
-    ( Kleisli(Kleisli) )
+import Control.Arrow ( Kleisli )
 import Control.Category ( Category(..) )
 import Control.Lens
     ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
@@ -33,9 +33,10 @@
 import Data.Functor.Contravariant.Divisible
     ( Decidable(..), Divisible(..) )
 import Data.Functor.Identity ( Identity(..) )
+import Data.Profunctor ( Star )
 import Data.Monoid(Monoid(mempty, mappend))
-import Data.Profunctor
-    ( Star(Star) )
+import Data.Reader.Reader
+    ( pureReader, homReader, reader, readerLens, star, kleisli )
 import Data.Semigroup ( Semigroup((<>)) )
 import Data.Void ( absurd )
 
@@ -61,9 +62,7 @@
     (a -> b)
     (a' -> b')
 reader3 =
-  iso
-    (\r -> runIdentity . view _Wrapped r)
-    (\f -> review _Wrapped (Identity . f))
+  reader
 
 reader3' ::
   Iso
@@ -87,9 +86,7 @@
     (Reader3Lens f s t a b)
     (Reader3Lens f' s' t' a' b')
 reader3Lens =
-  iso
-    (\k f -> Reader3T (k (view _Wrapped f)))
-    (\k f -> view _Wrapped (k (Reader3T f)))
+  readerLens
 
 star3 ::
   Iso
@@ -98,9 +95,7 @@
     (Reader3T f b a)
     (Reader3T f' b' a')
 star3 =
-  iso
-    (\(Star k) -> Reader3T k)
-    (\(Reader3T k) -> Star k)
+  star
 
 kleisli3 ::
   Iso
@@ -109,27 +104,32 @@
     (Reader3T f b a)
     (Reader3T f' b' a')
 kleisli3 =
-  iso
-    (\(Kleisli k) -> Reader3T k)
-    (\(Reader3T k) -> Kleisli k)
+  kleisli
 
-downReader3 ::
+liftReader3 ::
   Iso
     (Reader3T f b a)
     (Reader3T f' b' a')
     (Reader3 a (f b))
     (Reader3 a' (f' b'))
-downReader3 =
+liftReader3 =
   iso
     (review reader3 . view _Wrapped)
     (review _Wrapped . view reader3)
 
+pureReader3 ::
+  Applicative f =>
+  Reader3 a b
+  -> Reader3T f b a
+pureReader3 =
+  pureReader
+
 homReader3 ::
   (forall x. f x -> g x)
   -> Reader3T f b a
   -> Reader3T g b a
-homReader3 f =
-  over _Wrapped (f .)
+homReader3 =
+  homReader
 
 instance Contravariant (Reader3T f b) where
   contramap f =
