diff --git a/Data/Neither.hs b/Data/Neither.hs
--- a/Data/Neither.hs
+++ b/Data/Neither.hs
@@ -2,6 +2,10 @@
 -- applicative version of Either. It does not provide a monad instance, and
 -- 'mappend's together error values. 'MEither' is the monadic version, which
 -- only holds onto the first error value. 'MEitherT' is a monad transformer.
+--
+-- Also, *Either datatypes and utility functions from Data.Either
+-- are generalized with 'Neither' type class.
+
 module Data.Neither
     ( -- * Applicative version
       AEither (..)
@@ -13,8 +17,18 @@
     , MEitherT (..)
     , mapMEitherT
     , throwMEither
+      -- * Neither typeclass
+    , Neither (..)
+      -- * Utility functions
+    , mapLeft
+    , mapRight
+    , mapEither
+    , lefts
+    , rights
+    , partitionEithers
     ) where
 
 import Data.Neither.Base
+import Data.Neither.Class
 import Data.Neither.Transformers ()
 import Data.Neither.Mtl ()
diff --git a/Data/Neither/Class.hs b/Data/Neither/Class.hs
new file mode 100644
--- /dev/null
+++ b/Data/Neither/Class.hs
@@ -0,0 +1,45 @@
+module Data.Neither.Class where
+
+import Prelude hiding (either)
+import qualified Data.Either as E
+import Data.Neither.Base
+import Control.Monad
+import Control.Arrow ((&&&))
+
+class Neither e where
+  left :: a -> e a b
+  right :: b -> e a b
+  either :: (a -> c) -> (b -> c) -> e a b -> c
+
+instance Neither Either where
+  left = Left
+  right = Right
+  either = E.either
+
+instance Neither MEither where
+  left = MLeft
+  right = MRight
+  either = meither
+
+instance Neither AEither where
+  left = ALeft
+  right = ARight
+  either = aeither
+
+mapLeft :: Neither e => (a -> c) -> e a b -> e c b
+mapLeft = flip mapEither id
+
+mapRight :: Neither e => (b -> c) -> e a b -> e a c
+mapRight = mapEither id
+
+mapEither :: Neither e => (a -> c) -> (b -> d) -> e a b -> e c d
+mapEither f g = either (left . f) (right . g)
+
+lefts :: (Neither e, MonadPlus m) => m (e a b) -> m a
+lefts = (=<<) $ either return (const mzero)
+
+rights :: (Neither e, MonadPlus m) => m (e a b) -> m b
+rights = (=<<) $ either (const mzero) return
+
+partitionEithers :: (Neither e, MonadPlus m) => m (e a b) -> (m a, m b)
+partitionEithers = lefts &&& rights
diff --git a/neither.cabal b/neither.cabal
--- a/neither.cabal
+++ b/neither.cabal
@@ -1,5 +1,5 @@
 name:            neither
-version:         0.0.0
+version:         0.0.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -25,6 +25,7 @@
                      MonadCatchIO-mtl >= 0.3.0.1 && < 0.4
     exposed-modules: Data.Neither
     other-modules:   Data.Neither.Base
+                     Data.Neither.Class
                      Data.Neither.Transformers
                      Data.Neither.Mtl
     ghc-options:     -Wall
