diff --git a/Control/Monad/PhantomState.hs b/Control/Monad/PhantomState.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/PhantomState.hs
@@ -0,0 +1,77 @@
+
+-- | Phantom Monad State Transformer constructor and functions.
+module Control.Monad.PhantomState (
+    PhantomStateT (..)
+  , PhantomState
+  , useState
+  , changeState
+  , runPhantomStateT
+  , runPhantomState
+  ) where
+
+import Control.Applicative
+import Control.Monad.Trans.Class
+import Data.Functor.Identity
+
+-- | The Phantom State Monad Transformer is like the
+--   State Monad Transformer, but it does not hold
+--   any value.
+newtype PhantomStateT s m a = PhantomStateT (s -> m s)
+
+-- | Type synonym of 'PhantomStateT' where the underlying 'Monad' is the 'Identity' monad.
+type PhantomState s a = PhantomStateT s Identity a
+
+-- | Perform an applicative action using the current state, leaving
+--   the state unchanged.
+useState :: Applicative m => (s -> m a) -> PhantomStateT s m ()
+{-# INLINE useState #-}
+useState f = PhantomStateT $ \x -> f x *> pure x
+
+-- | Modify the state using a pure function.
+changeState :: Applicative m => (s -> s) -> PhantomStateT s m ()
+{-# INLINE changeState #-}
+changeState f = PhantomStateT $ pure . f
+
+-- | Perform a phantom state computation by setting an initial state
+--   and running all the actions from there.
+runPhantomStateT :: PhantomStateT s m a -- ^ Phantom state computation
+                 -> s -- ^ Initial state
+                 -> m s -- ^ Final result
+{-# INLINE runPhantomStateT #-}
+runPhantomStateT (PhantomStateT f) x = f x
+
+-- | Specialized version of 'runPhantomStateT' where the underlying
+--   'Monad' is the 'Identity' monad.
+runPhantomState :: PhantomState s a -- ^ Phantom state computation
+                -> s -- ^ Initial state
+                -> s -- ^ Final result
+{-# INLINE runPhantomState #-}
+runPhantomState f = runIdentity . runPhantomStateT f
+
+-- Instances
+
+instance Functor (PhantomStateT s m) where
+  {-# INLINE fmap #-}
+  fmap _ (PhantomStateT f) = PhantomStateT f
+
+instance Monad m => Applicative (PhantomStateT s m) where
+  {-# INLINE pure #-}
+  pure _ = PhantomStateT return
+  {-# INLINE (<*>) #-}
+  PhantomStateT f <*> PhantomStateT g = PhantomStateT (\x -> f x >>= g)
+  {-# INLINE  (*>) #-}
+  PhantomStateT f  *> PhantomStateT g = PhantomStateT (\x -> f x >>= g)
+  {-# INLINE (<*) #-}
+  PhantomStateT f <*  PhantomStateT g = PhantomStateT (\x -> f x >>= g)
+
+instance Monad m => Monad (PhantomStateT s m) where
+  {-# INLINE return #-}
+  return = pure
+  {-# INLINE (>>=) #-}
+  x >>= f = x *> f undefined
+  {-# INLINE (>>) #-}
+  (>>) = (*>)
+
+instance MonadTrans (PhantomStateT s) where
+  {-# INLINE lift #-}
+  lift m = PhantomStateT (\x -> m >> return x)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2014, Daniel Díaz
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Daniel Díaz nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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/phantom-state.cabal b/phantom-state.cabal
new file mode 100644
--- /dev/null
+++ b/phantom-state.cabal
@@ -0,0 +1,22 @@
+name:                phantom-state
+version:             0.1.0.0
+synopsis:            Phantom State Monad Transformer. Like State Monad, but without values.
+description:         A monad transformer that mimics the State Monad Transformer from the
+                     <http://hackage.haskell.org/package/transformers transformers> package,
+                     but dropping the values. In those cases that you want to use the State
+                     Monad but you only care about how the state changes, use this library
+                     to earn a plus of efficiency.
+license:             BSD3
+license-file:        LICENSE
+author:              Daniel Díaz
+maintainer:          dhelta.diaz@gmail.com
+category:            Control
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Control.Monad.PhantomState
+  build-depends:       base == 4.*
+                     , transformers >= 0.3 && < 0.5
+  default-language:    Haskell2010
+  ghc-options: -O2 -Wall
