diff --git a/Cabal/Distribution/Compat/ReadP.hs b/Cabal/Distribution/Compat/ReadP.hs
index 5c1113c3b8eeb23e092c38b3d8595c71da3d7377..44b970e559110763f527b89aa6ff4773524cdffe 100644
--- a/Cabal/Distribution/Compat/ReadP.hs
+++ b/Cabal/Distribution/Compat/ReadP.hs
@@ -69,7 +69,7 @@ module Distribution.Compat.ReadP
   )
  where
 
-import Control.Monad( MonadPlus(..), liftM2 )
+import Control.Monad( MonadPlus(..), liftM2, ap )
 import Data.Char (isSpace)
 import Control.Applicative (Applicative(..))
 
@@ -93,8 +93,7 @@ instance Functor (P s) where
 
 instance Applicative (P s) where
   pure = return
-
-  f <*> a = f >>= \f' -> fmap f' a
+  (<*>) = ap
 
 instance Monad (P s) where
   return x = Result x Fail
@@ -149,7 +148,7 @@ instance Functor (Parser r s) where
 
 instance Applicative (Parser r s) where
   pure = return
-  f <*> a = f >>= \f' -> fmap f' a
+  (<*>) = ap
 
 instance Monad (Parser r s) where
   return x  = R (\k -> k x)
diff --git a/Cabal/Distribution/PackageDescription/Parse.hs b/Cabal/Distribution/PackageDescription/Parse.hs
index 7197b1b15ac58ad8626ef805c3e3fbd783b25a83..6a786c39864b0e8a0e54f4e5c53f47348dcadec0 100644
--- a/Cabal/Distribution/PackageDescription/Parse.hs
+++ b/Cabal/Distribution/PackageDescription/Parse.hs
@@ -72,7 +72,8 @@ import Data.Char  (isSpace)
 import Data.Maybe (listToMaybe, isJust)
 import Data.Monoid ( Monoid(..) )
 import Data.List  (nub, unfoldr, partition, (\\))
-import Control.Monad (liftM, foldM, when, unless)
+import Control.Monad (liftM, foldM, when, unless, ap)
+import Control.Applicative (Applicative(..))
 import System.Directory (doesFileExist)
 import qualified Data.ByteString.Lazy.Char8 as BS.Char8
 
@@ -602,6 +603,13 @@ buildInfoNames = map fieldName binfoFieldDescrs
 -- on the 'mtl' package.
 newtype StT s m a = StT { runStT :: s -> m (a,s) }
 
+instance Functor f => Functor (StT s f) where
+    fmap g (StT f) = StT $ \s -> fmap (\(a,s') -> (g a,s')) $ f s
+
+instance (Monad m, Functor m) => Applicative (StT s m) where
+    pure = return
+    (<*>) = ap
+
 instance Monad m => Monad (StT s m) where
     return a = StT (\s -> return (a,s))
     StT f >>= g = StT $ \s -> do
diff --git a/Cabal/Distribution/ParseUtils.hs b/Cabal/Distribution/ParseUtils.hs
index 16ed6d6a846927c2a906a4f331a72a2cde3225cb..07d91c7926d367e583984b81bc298fa417537476 100644
--- a/Cabal/Distribution/ParseUtils.hs
+++ b/Cabal/Distribution/ParseUtils.hs
@@ -87,7 +87,7 @@ import Data.Char (isSpace, toLower, isAlphaNum, isDigit)
 import Data.Maybe       (fromMaybe)
 import Data.Tree as Tree (Tree(..), flatten)
 import qualified Data.Map as Map
-import Control.Monad (foldM) 
+import Control.Monad (foldM, ap) 
 import Control.Applicative (Applicative(..))
 import System.FilePath (normalise)
 import Data.List (sortBy)
@@ -122,7 +122,8 @@ instance Functor ParseResult where
         
 instance Applicative ParseResult where
         pure = ParseOk []
-        f <*> a = f >>= \f' -> fmap f' a
+        (<*>) = ap
+        
 
 instance Monad ParseResult where
         return = ParseOk []
diff --git a/Cabal/Distribution/Simple/BuildTarget.hs b/Cabal/Distribution/Simple/BuildTarget.hs
index daf1c64300d7b67cf81a28baef8212f4e5407217..68f5a772034f69f71a080b111230da74687ba5c1 100644
--- a/Cabal/Distribution/Simple/BuildTarget.hs
+++ b/Cabal/Distribution/Simple/BuildTarget.hs
@@ -55,6 +55,7 @@ import Data.Either
          ( partitionEithers )
 import qualified Data.Map as Map
 import Control.Monad
+import Control.Applicative (Applicative(..))
 import qualified Distribution.Compat.ReadP as Parse
 import Distribution.Compat.ReadP
          ( (+++), (<++) )
@@ -769,6 +770,10 @@ instance Functor Match where
   fmap f (ExactMatch   d xs) = ExactMatch   d (fmap f xs)
   fmap f (InexactMatch d xs) = InexactMatch d (fmap f xs)
 
+instance Applicative Match where
+  pure = return
+  (<*>) = ap
+
 instance Monad Match where
   return a                = ExactMatch 0 [a]
   NoMatch      d ms >>= _ = NoMatch d ms