diff --git a/Control/Monad/Failure.hs b/Control/Monad/Failure.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Failure.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverlappingInstances #-}
+
+{-| Defines the class @MonadFailure@ for monads which can fail.
+-}
+module Control.Monad.Failure where
+
+import Control.Exception (throw, Exception)
+import Control.Monad
+#if TRANSFORMERS
+import Control.Monad.Trans
+import Control.Monad.Trans.Error
+import Control.Monad.Trans.List
+import Control.Monad.Trans.Reader
+import Control.Monad.Trans.State
+import Control.Monad.Trans.Writer
+import Control.Monad.Trans.RWS
+#else
+import Control.Monad.Error
+import Control.Monad.List
+import Control.Monad.Reader
+import Control.Monad.State
+import Control.Monad.Writer
+import Control.Monad.RWS
+#endif
+
+import Data.Monoid
+
+class Monad m => MonadFailure e m where
+    failure :: e -> m a
+
+-- ----------
+-- Instances
+-- ----------
+instance MonadFailure e Maybe where failure _ = Nothing
+instance MonadFailure e []    where failure _ = []
+
+instance Exception e => MonadFailure e IO where
+  failure = Control.Exception.throw
+
+instance (Error e) => MonadFailure e (Either e) where
+  failure = Left
+
+instance (Error e, Monad m) => MonadFailure e (ErrorT e m) where
+  failure = throwError
+
+instance MonadFailure e m => MonadFailure e (ListT m) where
+  failure = lift . failure
+
+instance MonadFailure e m => MonadFailure e (ReaderT r m) where
+  failure = lift . failure
+
+instance (Monoid w, MonadFailure e m) => MonadFailure e (WriterT w  m) where
+  failure = lift . failure
+
+instance MonadFailure e m => MonadFailure e (StateT s m) where
+  failure = lift . failure
+
+instance (Monoid w, MonadFailure e m) => MonadFailure e (RWST r w s m) where
+  failure = lift . failure
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/control-monad-failure.cabal b/control-monad-failure.cabal
new file mode 100644
--- /dev/null
+++ b/control-monad-failure.cabal
@@ -0,0 +1,35 @@
+name: control-monad-failure
+version: 0.1
+Cabal-Version:  >= 1.2.3
+build-type: Simple
+license: PublicDomain
+author: Pepe Iborra, Michael Snoyman, Nicolas Pouillard
+maintainer: pepeiborra@gmail.com
+homepage: http://github.com/pepeiborra/control-monad-failure
+description: A class for monads which can fail with an error.
+synopsis: A class for monads which can fail with an error.
+category: Control, Monads
+stability: experimental
+
+Flag transformers
+   default: False
+
+Flag extensibleExceptionsInBase
+
+Library
+  buildable: True
+  build-depends: pretty, template-haskell
+
+  if flag(transformers)
+     build-depends: transformers
+     cpp-options: -DTRANSFORMERS
+  else
+     build-depends: mtl
+  if flag(extensibleExceptionsInBase)
+     build-depends: base >= 4 && < 5
+  else
+     build-depends: base >= 3 && < 4, extensible-exceptions
+
+  extensions:  MultiParamTypeClasses, FlexibleInstances
+  exposed-modules:
+     Control.Monad.Failure
