diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 *Implement effectful computations in a modular way!*
 
-The main and only monad is built upon `Eff` from `Control.Eff`.
+The main monad of this package is `Eff` from `Control.Eff`.
 `Eff r a` is parameterized by the effect-list `r` and the monadic-result type
 `a` similar to other monads.
 It is the intention that all other monadic computations can be replaced by the
diff --git a/extensible-effects.cabal b/extensible-effects.cabal
--- a/extensible-effects.cabal
+++ b/extensible-effects.cabal
@@ -6,7 +6,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             2.6.3.0
+version:             3.0.0.0
 
 -- A short (one-line) description of the package.
 synopsis:            An Alternative to Monad Transformers
@@ -85,6 +85,7 @@
                        Control.Eff.Writer.Strict
                        Data.OpenUnion
                        Control.Eff.QuickStart
+                       Control.Eff.Extend
 
   -- Modules included in this library but not exported.
   other-modules:       Control.Eff.Internal
diff --git a/src/Control/Eff.hs b/src/Control/Eff.hs
--- a/src/Control/Eff.hs
+++ b/src/Control/Eff.hs
@@ -1,6 +1,34 @@
-module Control.Eff ( module Internal
-                   , module OpenUnion
-                   ) where
+{-# LANGUAGE ExplicitNamespaces #-}
 
-import Control.Eff.Internal as Internal hiding (Lift(..), lift, runLift)
+-- | A monadic library for implementing effectful computation in a modular way.
+--
+-- This module provides the @Eff@ monad - the base type for all effectful
+-- computation.
+-- The @Member@ typeclass is the main interface for describing which effects
+-- are necessary for a given function.
+--
+-- Consult the @Control.Eff.QuickStart@ module and the readme for gentle
+-- introductions.
+--
+-- To use extensible effects effectively some language extensions are
+-- necessary/recommended.
+--
+-- @
+-- {-\# LANGUAGE ScopedTypeVariables \#-}
+-- {-\# LANGUAGE FlexibleContexts \#-}
+-- {-\# LANGUAGE MonoLocalBinds \#-}
+-- @
+--
+
+module Control.Eff
+  ( -- * Effect base-type
+    Internal.run
+  , Internal.Eff
+    -- * Effect list
+  , OpenUnion.Member
+  , OpenUnion.SetMember
+  , type(<::)
+  ) where
+
+import Control.Eff.Internal as Internal
 import Data.OpenUnion as OpenUnion
diff --git a/src/Control/Eff/Choose.hs b/src/Control/Eff/Choose.hs
--- a/src/Control/Eff/Choose.hs
+++ b/src/Control/Eff/Choose.hs
@@ -18,8 +18,10 @@
                           , mplus'
                           ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
+      
 import Control.Applicative
 import Control.Monad
 import Control.Monad.Base
diff --git a/src/Control/Eff/Coroutine.hs b/src/Control/Eff/Coroutine.hs
--- a/src/Control/Eff/Coroutine.hs
+++ b/src/Control/Eff/Coroutine.hs
@@ -11,6 +11,7 @@
                             ) where
 
 import Control.Eff
+import Control.Eff.Extend
 
 -- ------------------------------------------------------------------------
 -- | Co-routines
diff --git a/src/Control/Eff/Cut.hs b/src/Control/Eff/Cut.hs
--- a/src/Control/Eff/Cut.hs
+++ b/src/Control/Eff/Cut.hs
@@ -41,6 +41,7 @@
 module Control.Eff.Cut where
 
 import Control.Eff
+import Control.Eff.Extend
 import Control.Eff.Exception
 import Control.Eff.Choose
 
diff --git a/src/Control/Eff/Example.hs b/src/Control/Eff/Example.hs
--- a/src/Control/Eff/Example.hs
+++ b/src/Control/Eff/Example.hs
@@ -7,6 +7,7 @@
 module Control.Eff.Example where
 
 import Control.Eff
+import Control.Eff.Extend
 import Control.Eff.Exception
 
 import Control.Eff.Reader.Lazy
diff --git a/src/Control/Eff/Exception.hs b/src/Control/Eff/Exception.hs
--- a/src/Control/Eff/Exception.hs
+++ b/src/Control/Eff/Exception.hs
@@ -24,8 +24,9 @@
                             , ignoreFail
                             ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Monad (void)
 import Control.Monad.Base
@@ -54,8 +55,8 @@
 throwError e = send (Exc e)
 {-# INLINE throwError #-}
 
--- | Throw an exception in an effectful computation. The type is unit, 
---   which suppresses the ghc-mod warning "A do-notation statement 
+-- | Throw an exception in an effectful computation. The type is unit,
+--   which suppresses the ghc-mod warning "A do-notation statement
 --   discarded a result of type"
 throwError_ :: (Member (Exc e) r) => e -> Eff r ()
 throwError_ = throwError
diff --git a/src/Control/Eff/Extend.hs b/src/Control/Eff/Extend.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Eff/Extend.hs
@@ -0,0 +1,40 @@
+-- | This module exports functions, types, and typeclasses necessary for
+-- implementing a custom effect and/or effect handler.
+--
+
+module Control.Eff.Extend
+  ( -- * The effect monad
+    Eff(..)
+  , run
+    -- * Open Unions
+  , OpenUnion.Union
+  , OpenUnion.Member
+  , inj
+  , prj
+  , decomp
+  , SetMember
+  , weaken
+  -- * Helper functions that are used for implementing effect-handlers
+  , handle_relay
+  , handle_relay_s
+  , interpose
+  , raise
+  , send
+  -- * Arrow types and compositions
+  , Arr
+  , Arrs
+  , first
+  , singleK
+  , qApp
+  , (^$)
+  , arr
+  , ident
+  , comp
+  , (^|>)
+  , qComp
+  , qComps
+  )
+where
+
+import           Data.OpenUnion                as OpenUnion
+import           Control.Eff.Internal
diff --git a/src/Control/Eff/Fresh.hs b/src/Control/Eff/Fresh.hs
--- a/src/Control/Eff/Fresh.hs
+++ b/src/Control/Eff/Fresh.hs
@@ -13,8 +13,9 @@
                         , runFresh'
                         ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/Internal.hs b/src/Control/Eff/Internal.hs
--- a/src/Control/Eff/Internal.hs
+++ b/src/Control/Eff/Internal.hs
@@ -22,8 +22,7 @@
 -- Extensible Effects are implemented as typeclass constraints on an Eff[ect] datatype.
 -- A contrived example can be found under "Control.Eff.Example". To run the
 -- effects, consult the tests.
-module Control.Eff.Internal ( module Control.Eff.Internal
-                            ) where
+module Control.Eff.Internal where
 
 #if __GLASGOW_HASKELL__ < 710
 import Control.Applicative
@@ -189,10 +188,10 @@
 
 
 -- ------------------------------------------------------------------------
--- | The initial case, no effects. Get the result from a pure computation.
+-- | Get the result from a pure (i.e. no effects) computation.
 --
 -- The type of run ensures that all effects must be handled:
--- only pure computations may be run.
+-- only pure computations can be run.
 run :: Eff '[] w -> w
 run (Val x) = x
 -- | the other case is unreachable since Union [] a cannot be
diff --git a/src/Control/Eff/NdetEff.hs b/src/Control/Eff/NdetEff.hs
--- a/src/Control/Eff/NdetEff.hs
+++ b/src/Control/Eff/NdetEff.hs
@@ -15,8 +15,9 @@
 -- | Another implementation of nondeterministic choice effect
 module Control.Eff.NdetEff where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Applicative
 import Control.Monad
diff --git a/src/Control/Eff/Operational.hs b/src/Control/Eff/Operational.hs
--- a/src/Control/Eff/Operational.hs
+++ b/src/Control/Eff/Operational.hs
@@ -19,6 +19,7 @@
                                ) where
 
 import Control.Eff
+import Control.Eff.Extend
 
 -- | Lift values to an effect.
 -- You can think this is a generalization of @Lift@.
diff --git a/src/Control/Eff/QuickStart.hs b/src/Control/Eff/QuickStart.hs
--- a/src/Control/Eff/QuickStart.hs
+++ b/src/Control/Eff/QuickStart.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MonoLocalBinds #-}
 
 -- | This module contains several tiny examples of how to use effects.
 -- For technical details, see the documentation in the effect-modules.
@@ -11,15 +12,23 @@
 -- be used to construct much more complicated programs by composing the little
 -- pieces shown here.
 --
--- This module imports and reexports modules from this library:
+-- This module imports and reexports modules from this library and requires
+-- some language extensions:
 --
 -- @
+-- {-\# LANGUAGE ScopedTypeVariables \#-}
+-- {-\# LANGUAGE FlexibleContexts \#-}
+-- {-\# LANGUAGE MonoLocalBinds \#-}
+--
 -- import Control.Eff
 -- import Control.Eff.Reader.Lazy
 -- import Control.Eff.Writer.Lazy
 -- import Control.Eff.State.Lazy
 -- import Control.Eff.Exception
 -- @
+--
+-- If you want to see what each extension is good for, you can disable it and
+-- see what GHC will complain about.
 --
 module Control.Eff.QuickStart
   ( -- * Examples
diff --git a/src/Control/Eff/Reader/Lazy.hs b/src/Control/Eff/Reader/Lazy.hs
--- a/src/Control/Eff/Reader/Lazy.hs
+++ b/src/Control/Eff/Reader/Lazy.hs
@@ -15,8 +15,9 @@
                               , runReader
                               ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/Reader/Strict.hs b/src/Control/Eff/Reader/Strict.hs
--- a/src/Control/Eff/Reader/Strict.hs
+++ b/src/Control/Eff/Reader/Strict.hs
@@ -16,8 +16,9 @@
                               , runReader
                               ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/State/Lazy.hs b/src/Control/Eff/State/Lazy.hs
--- a/src/Control/Eff/State/Lazy.hs
+++ b/src/Control/Eff/State/Lazy.hs
@@ -11,10 +11,12 @@
 -- | Lazy state effect
 module Control.Eff.State.Lazy where
 
-import Control.Eff.Internal
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
+
 import Control.Eff.Writer.Lazy
 import Control.Eff.Reader.Lazy
-import Data.OpenUnion
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/State/OnDemand.hs b/src/Control/Eff/State/OnDemand.hs
--- a/src/Control/Eff/State/OnDemand.hs
+++ b/src/Control/Eff/State/OnDemand.hs
@@ -11,10 +11,12 @@
 -- | Lazy state effect
 module Control.Eff.State.OnDemand where
 
-import Control.Eff.Internal
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
+
 import Control.Eff.Writer.Lazy
 import Control.Eff.Reader.Lazy
-import Data.OpenUnion
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/State/Strict.hs b/src/Control/Eff/State/Strict.hs
--- a/src/Control/Eff/State/Strict.hs
+++ b/src/Control/Eff/State/Strict.hs
@@ -12,10 +12,12 @@
 -- | Strict state effect
 module Control.Eff.State.Strict where
 
-import Control.Eff.Internal
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
+
 import Control.Eff.Writer.Strict
 import Control.Eff.Reader.Strict
-import Data.OpenUnion
 
 import Control.Monad.Base
 import Control.Monad.Trans.Control
diff --git a/src/Control/Eff/Trace.hs b/src/Control/Eff/Trace.hs
--- a/src/Control/Eff/Trace.hs
+++ b/src/Control/Eff/Trace.hs
@@ -10,6 +10,7 @@
                         ) where
 
 import Control.Eff
+import Control.Eff.Extend
 
 -- | Trace effect for debugging
 data Trace v where
diff --git a/src/Control/Eff/Writer/Lazy.hs b/src/Control/Eff/Writer/Lazy.hs
--- a/src/Control/Eff/Writer/Lazy.hs
+++ b/src/Control/Eff/Writer/Lazy.hs
@@ -24,8 +24,9 @@
                                , execMonoidWriter
                                ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Applicative ((<|>))
 
diff --git a/src/Control/Eff/Writer/Strict.hs b/src/Control/Eff/Writer/Strict.hs
--- a/src/Control/Eff/Writer/Strict.hs
+++ b/src/Control/Eff/Writer/Strict.hs
@@ -25,8 +25,9 @@
                                , execMonoidWriter
                                ) where
 
-import Control.Eff.Internal
-import Data.OpenUnion
+import Control.Eff
+import Control.Eff.Extend
+import Control.Eff.Lift
 
 import Control.Applicative ((<|>))
 
diff --git a/src/Data/OpenUnion.hs b/src/Data/OpenUnion.hs
--- a/src/Data/OpenUnion.hs
+++ b/src/Data/OpenUnion.hs
@@ -94,6 +94,11 @@
 
 newtype P t r = P{unP :: Int}
 
+-- | Typeclass that asserts that effect @t@ is contained inside the effect-list
+-- @r@.
+--
+-- The @FindElem@ typeclass is necessary for implementation reasons and is not
+-- required for using the effect list.
 class (FindElem t r) => Member (t :: * -> *) r where
   inj :: t v -> Union r v
   prj :: Union r v -> Maybe (t v)
