diff --git a/IOSpec.cabal b/IOSpec.cabal
--- a/IOSpec.cabal
+++ b/IOSpec.cabal
@@ -1,8 +1,8 @@
 Name:		        IOSpec
-Version:        	0.2.5
+Version:        	0.2.6
 License:        	BSD3
 License-file:		LICENSE
-Author:			Wouter Swierstra, Yusaku Hashimoto
+Author:			Wouter Swierstra, Yusaku Hashimoto, Nikolay Amiantov
 Maintainer:     	Wouter Swierstra <wouter.swierstra@gmail.com>
 Synopsis:       	A pure specification of the IO monad.
 Description:		This package consists of several modules, that give a
@@ -41,7 +41,7 @@
 			with the source distribution.
 Category:       	Testing
 Build-Type:		Simple
-Build-Depends:  	base >= 2 && < 5, mtl, QuickCheck >= 2 && < 3, Stream
+Build-Depends:  	base >= 4.8.0.0 && < 5, mtl, QuickCheck >= 2 && < 3, Stream
 Extensions:		MultiParamTypeClasses, OverlappingInstances
 Ghc-options:		-Wall
 Hs-source-dirs:		src
diff --git a/src/Test/IOSpec/STM.hs b/src/Test/IOSpec/STM.hs
--- a/src/Test/IOSpec/STM.hs
+++ b/src/Test/IOSpec/STM.hs
@@ -23,6 +23,7 @@
 import Data.Dynamic
 import Data.Maybe (fromJust)
 import Control.Monad.State
+import Control.Monad (ap)
 
 -- The 'STMS' data type and its instances.
 --
@@ -67,14 +68,18 @@
   fmap _ Retry              = Retry
   fmap f (OrElse io1 io2)   = OrElse (fmap f io1) (fmap f io2)
 
+instance Applicative STM where
+  pure  = STMReturn
+  (<*>) = ap
+
 instance Monad STM where
-    return                = STMReturn
-    STMReturn a >>= f     = f a
-    NewTVar d g >>= f     = NewTVar d (\l -> g l >>= f)
-    ReadTVar l g >>= f    = ReadTVar l (\d -> g d >>= f)
-    WriteTVar l d p >>= f = WriteTVar l d (p >>= f)
-    Retry >>= _           = Retry
-    OrElse p q >>= f      = OrElse (p >>= f) (q >>= f)
+  return                = STMReturn
+  STMReturn a >>= f     = f a
+  NewTVar d g >>= f     = NewTVar d (\l -> g l >>= f)
+  ReadTVar l g >>= f    = ReadTVar l (\d -> g d >>= f)
+  WriteTVar l d p >>= f = WriteTVar l d (p >>= f)
+  Retry >>= _           = Retry
+  OrElse p q >>= f      = OrElse (p >>= f) (q >>= f)
 
 -- | A 'TVar' is a shared, mutable variable used by STM.
 newtype TVar a = TVar Loc
diff --git a/src/Test/IOSpec/Types.hs b/src/Test/IOSpec/Types.hs
--- a/src/Test/IOSpec/Types.hs
+++ b/src/Test/IOSpec/Types.hs
@@ -15,6 +15,8 @@
   , inject
   ) where
 
+import Control.Monad (ap)
+
 -- | A value of type 'IOSpec' @f@ @a@ is either a pure value of type @a@
 -- or some effect, determined by @f@. Crucially, 'IOSpec' @f@ is a
 -- monad, provided @f@ is a functor.
@@ -25,6 +27,10 @@
 instance (Functor f) => Functor (IOSpec f) where
   fmap f (Pure x)   = Pure (f x)
   fmap f (Impure t) = Impure (fmap (fmap f) t)
+
+instance (Functor f) => Applicative (IOSpec f) where
+  pure             = Pure
+  (<*>)            = ap
 
 instance (Functor f) => Monad (IOSpec f) where
   return           = Pure
diff --git a/src/Test/IOSpec/VirtualMachine.hs b/src/Test/IOSpec/VirtualMachine.hs
--- a/src/Test/IOSpec/VirtualMachine.hs
+++ b/src/Test/IOSpec/VirtualMachine.hs
@@ -43,6 +43,7 @@
 import qualified Data.Stream as Stream
 import Test.IOSpec.Types
 import Test.QuickCheck
+import Control.Monad (ap)
 
 type Data         = Dynamic
 type Loc          = Int
@@ -210,6 +211,10 @@
   fmap f (ReadChar t) = ReadChar (\c -> fmap f (t c))
   fmap f (Print c t) = Print c (fmap f t)
   fmap _ (Fail msg) = Fail msg
+
+instance Applicative Effect where
+  pure = Done
+  (<*>) = ap
 
 instance Monad Effect where
   return = Done
