diff --git a/cabal-install/Distribution/Client/BuildReports/Storage.hs b/cabal-install/Distribution/Client/BuildReports/Storage.hs
index 78bcdf0d9085b3f736da044d6392eb0010e66bc1..66e3fc6a84ea6e0b0a6c9a561fb56979280b6965 100644
--- a/cabal-install/Distribution/Client/BuildReports/Storage.hs
+++ b/cabal-install/Distribution/Client/BuildReports/Storage.hs
@@ -36,8 +36,6 @@ import Distribution.Package
          ( PackageId, packageId )
 import Distribution.PackageDescription
          ( FlagAssignment )
-import Distribution.InstalledPackageInfo
-         ( InstalledPackageInfo )
 import Distribution.Simple.InstallDirs
          ( PathTemplate, fromPathTemplate
          , initialPathTemplateEnv, substPathTemplate )
@@ -119,9 +117,7 @@ storeLocal cinfo templates reports platform = sequence_
 -- ------------------------------------------------------------
 
 fromInstallPlan :: Platform -> CompilerId
-                -> InstallPlan InstalledPackageInfo
-                               ConfiguredPackage
-                               BuildSuccess BuildFailure
+                -> InstallPlan
                 -> [(BuildReport, Maybe Repo)]
 fromInstallPlan platform comp plan =
      catMaybes
@@ -130,9 +126,7 @@ fromInstallPlan platform comp plan =
    $ plan
 
 fromPlanPackage :: Platform -> CompilerId
-                -> InstallPlan.PlanPackage InstalledPackageInfo
-                                           ConfiguredPackage
-                                           BuildSuccess BuildFailure
+                -> InstallPlan.PlanPackage
                 -> Maybe (BuildReport, Maybe Repo)
 fromPlanPackage (Platform arch os) comp planPackage = case planPackage of
   InstallPlan.Installed (ReadyPackage (ConfiguredPackage srcPkg flags _ _) deps)
diff --git a/cabal-install/Distribution/Client/Configure.hs b/cabal-install/Distribution/Client/Configure.hs
index 9e731beff426f9d3cf7017a0d324a811bdc94dee..5b8f5ab38e12fbd3db7005b7b684553712404220 100644
--- a/cabal-install/Distribution/Client/Configure.hs
+++ b/cabal-install/Distribution/Client/Configure.hs
@@ -42,7 +42,6 @@ import Distribution.Simple.Setup
 import Distribution.Simple.PackageIndex (InstalledPackageIndex)
 import Distribution.Simple.Utils
          ( defaultPackageDesc )
-import Distribution.InstalledPackageInfo (InstalledPackageInfo) 
 import qualified Distribution.InstalledPackageInfo as Installed
 import Distribution.Package
          ( Package(..), InstalledPackageId, packageName
@@ -131,8 +130,7 @@ configure verbosity packageDBs repos comp platform conf
 
   where
     setupScriptOptions :: InstalledPackageIndex
-                       -> Maybe (ReadyPackage ConfiguredPackage
-                                              InstalledPackageInfo)
+                       -> Maybe ReadyPackage
                        -> SetupScriptOptions
     setupScriptOptions =
       configureSetupScript
@@ -160,8 +158,7 @@ configureSetupScript :: PackageDBStack
                      -> Maybe Lock
                      -> Bool
                      -> InstalledPackageIndex
-                     -> Maybe (ReadyPackage ConfiguredPackage
-                                            InstalledPackageInfo)
+                     -> Maybe ReadyPackage
                      -> SetupScriptOptions
 configureSetupScript packageDBs
                      comp
@@ -232,10 +229,7 @@ planLocalPackage :: Verbosity -> Compiler
                  -> ConfigFlags -> ConfigExFlags
                  -> InstalledPackageIndex
                  -> SourcePackageDb
-                 -> IO (Progress String String
-                                 (InstallPlan InstalledPackageInfo
-                                              ConfiguredPackage
-                                              iresult ifailure))
+                 -> IO (Progress String String InstallPlan)
 planLocalPackage verbosity comp platform configFlags configExFlags installedPkgIndex
   (SourcePackageDb _ packagePrefs) = do
   pkg <- readPackageDescription verbosity =<< defaultPackageDesc verbosity
@@ -301,7 +295,7 @@ configurePackage :: Verbosity
                  -> Platform -> CompilerInfo
                  -> SetupScriptOptions
                  -> ConfigFlags
-                 -> ReadyPackage ConfiguredPackage InstalledPackageInfo
+                 -> ReadyPackage
                  -> [String]
                  -> IO ()
 configurePackage verbosity platform comp scriptOptions configFlags
diff --git a/cabal-install/Distribution/Client/Dependency.hs b/cabal-install/Distribution/Client/Dependency.hs
index cb1aeb74ce457a0a4ffa0a2b686d0894b1c317ec..551cae72c526b29aa4268b099cf6776690ba92c1 100644
--- a/cabal-install/Distribution/Client/Dependency.hs
+++ b/cabal-install/Distribution/Client/Dependency.hs
@@ -83,8 +83,6 @@ import Distribution.Client.Targets
 import Distribution.Client.ComponentDeps (ComponentDeps)
 import qualified Distribution.Client.ComponentDeps as CD
 import qualified Distribution.InstalledPackageInfo as Installed
-import Distribution.InstalledPackageInfo
-         ( InstalledPackageInfo )
 import Distribution.Package
          ( PackageName(..), PackageIdentifier(PackageIdentifier), PackageId
          , Package(..), packageName, packageVersion
@@ -525,10 +523,7 @@ resolveDependencies :: Platform
                     -> CompilerInfo
                     -> Solver
                     -> DepResolverParams
-                    -> Progress String String
-                                (InstallPlan InstalledPackageInfo
-                                             ConfiguredPackage
-                                             iresult ifailure)
+                    -> Progress String String InstallPlan
 
     --TODO: is this needed here? see dontUpgradeNonUpgradeablePackages
 resolveDependencies platform comp _solver params
@@ -613,9 +608,7 @@ validateSolverResult :: Platform
                      -> CompilerInfo
                      -> Bool
                      -> [ResolverPackage]
-                     -> InstallPlan InstalledPackageInfo
-                                    ConfiguredPackage
-                                    iresult ifailure
+                     -> InstallPlan
 validateSolverResult platform comp indepGoals pkgs =
     case planPackagesProblems platform comp pkgs of
       [] -> case InstallPlan.new indepGoals index of
diff --git a/cabal-install/Distribution/Client/Freeze.hs b/cabal-install/Distribution/Client/Freeze.hs
index d75a2c07c44f5b95c3e92179ef487cf016592755..63cef905b93445d12dccbcd20c2db34c3d7d1f6d 100644
--- a/cabal-install/Distribution/Client/Freeze.hs
+++ b/cabal-install/Distribution/Client/Freeze.hs
@@ -36,10 +36,7 @@ import Distribution.Client.Sandbox.Types
          ( SandboxPackageInfo(..) )
 
 import Distribution.Package
-         ( Package, packageId, packageName, packageVersion
-         , HasInstalledPackageId )
-import Distribution.InstalledPackageInfo
-         ( InstalledPackageInfo )
+         ( Package, packageId, packageName, packageVersion )
 import Distribution.Simple.Compiler
          ( Compiler, compilerInfo, PackageDBStack )
 import Distribution.Simple.PackageIndex (InstalledPackageIndex)
@@ -133,9 +130,7 @@ planPackages :: Verbosity
              -> InstalledPackageIndex
              -> SourcePackageDb
              -> [PackageSpecifier SourcePackage]
-             -> IO [PlanPackage InstalledPackageInfo
-                                ConfiguredPackage
-                                iresult ifailure]
+             -> IO [PlanPackage]
 planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
              installedPkgIndex sourcePkgDb pkgSpecifiers = do
 
@@ -198,11 +193,9 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
 -- 2) not a dependency (directly or transitively) of the package we are
 --    freezing.  This is useful for removing previously installed packages
 --    which are no longer required from the install plan.
-pruneInstallPlan :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
-                     HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
-                 => InstallPlan ipkg srcpkg iresult ifailure
+pruneInstallPlan :: InstallPlan
                  -> [PackageSpecifier SourcePackage]
-                 -> [PlanPackage ipkg srcpkg iresult ifailure]
+                 -> [PlanPackage]
 pruneInstallPlan installPlan pkgSpecifiers =
     either (const brokenPkgsErr)
            (removeSelf pkgIds . PackageIndex.allPackages) $
diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs
index aa285ae167498e04f63f8ed65c786ed78a77e35e..9894f6c32157928262e49fa3ee113e3769726e8c 100644
--- a/cabal-install/Distribution/Client/Install.hs
+++ b/cabal-install/Distribution/Client/Install.hs
@@ -145,8 +145,6 @@ import Distribution.PackageDescription
          , FlagName(..), FlagAssignment )
 import Distribution.PackageDescription.Configuration
          ( finalizePackageDescription )
-import Distribution.InstalledPackageInfo
-         ( InstalledPackageInfo )
 import Distribution.ParseUtils
          ( showPWarning )
 import Distribution.Version
@@ -283,10 +281,7 @@ makeInstallContext verbosity
 
 -- | Make an install plan given install context and install arguments.
 makeInstallPlan :: Verbosity -> InstallArgs -> InstallContext
-                -> IO (Progress String String
-                                (InstallPlan InstalledPackageInfo
-                                             ConfiguredPackage
-                                             iresult ifailure))
+                -> IO (Progress String String InstallPlan)
 makeInstallPlan verbosity
   (_, _, comp, platform, _, _, mSandboxPkgInfo,
    _, configFlags, configExFlags, installFlags,
@@ -303,9 +298,7 @@ makeInstallPlan verbosity
 
 -- | Given an install plan, perform the actual installations.
 processInstallPlan :: Verbosity -> InstallArgs -> InstallContext
-                   -> InstallPlan InstalledPackageInfo
-                                  ConfiguredPackage
-                                  BuildSuccess BuildFailure
+                   -> InstallPlan
                    -> IO ()
 processInstallPlan verbosity
   args@(_,_, _, _, _, _, _, _, _, _, installFlags, _)
@@ -336,10 +329,7 @@ planPackages :: Compiler
              -> InstalledPackageIndex
              -> SourcePackageDb
              -> [PackageSpecifier SourcePackage]
-             -> Progress String String
-                         (InstallPlan InstalledPackageInfo
-                                      ConfiguredPackage
-                                      iresult ifailure)
+             -> Progress String String InstallPlan
 planPackages comp platform mSandboxPkgInfo solver
              configFlags configExFlags installFlags
              installedPkgIndex sourcePkgDb pkgSpecifiers =
@@ -419,13 +409,10 @@ planPackages comp platform mSandboxPkgInfo solver
     allowNewer       = fromFlag (configAllowNewer        configExFlags)
 
 -- | Remove the provided targets from the install plan.
-pruneInstallPlan :: (Package targetpkg, Package srcpkg, Package ipkg,
-                     PackageFixedDeps srcpkg, PackageFixedDeps ipkg,
-                     HasInstalledPackageId srcpkg, HasInstalledPackageId ipkg)
+pruneInstallPlan :: Package targetpkg
                  => [PackageSpecifier targetpkg]
-                 -> InstallPlan ipkg srcpkg iresult ifailure
-                 -> Progress String String
-                             (InstallPlan ipkg srcpkg iresult ifailure)
+                 -> InstallPlan
+                 -> Progress String String InstallPlan
 pruneInstallPlan pkgSpecifiers =
   -- TODO: this is a general feature and should be moved to D.C.Dependency
   -- Also, the InstallPlan.remove should return info more precise to the
@@ -459,9 +446,7 @@ pruneInstallPlan pkgSpecifiers =
 -- either requested or needed.
 checkPrintPlan :: Verbosity
                -> InstalledPackageIndex
-               -> InstallPlan InstalledPackageInfo
-                              ConfiguredPackage
-                              BuildSuccess ifailure
+               -> InstallPlan
                -> SourcePackageDb
                -> InstallFlags
                -> [PackageSpecifier SourcePackage]
@@ -552,11 +537,9 @@ checkPrintPlan verbosity installed installPlan sourcePkgDb
     overrideReinstall = fromFlag (installOverrideReinstall installFlags)
 
 --TODO: this type is too specific
-linearizeInstallPlan :: (PackageFixedDeps srcpkg, HasInstalledPackageId srcpkg)
-                     => InstalledPackageIndex
-                     -> InstallPlan InstalledPackageInfo srcpkg
-                                    BuildSuccess ifailure
-                     -> [(ReadyPackage srcpkg InstalledPackageInfo, PackageStatus)]
+linearizeInstallPlan :: InstalledPackageIndex
+                     -> InstallPlan
+                     -> [(ReadyPackage, PackageStatus)]
 linearizeInstallPlan installedPkgIndex plan =
     unfoldr next plan
   where
@@ -588,9 +571,8 @@ extractReinstalls :: PackageStatus -> [InstalledPackageId]
 extractReinstalls (Reinstall ipids _) = ipids
 extractReinstalls _                   = []
 
-packageStatus :: (Package srcpkg, HasInstalledPackageId ipkg)
-              => InstalledPackageIndex
-              -> ReadyPackage srcpkg ipkg
+packageStatus :: InstalledPackageIndex
+              -> ReadyPackage
               -> PackageStatus
 packageStatus installedPkgIndex cpkg =
   case PackageIndex.lookupPackageName installedPkgIndex
@@ -604,9 +586,8 @@ packageStatus installedPkgIndex cpkg =
 
   where
 
-    changes :: (Package srcpkg, HasInstalledPackageId ipkg)
-            => Installed.InstalledPackageInfo
-            -> ReadyPackage srcpkg ipkg
+    changes :: Installed.InstalledPackageInfo
+            -> ReadyPackage
             -> [MergeResult PackageIdentifier PackageIdentifier]
     changes pkg pkg' = filter changed $
       mergeBy (comparing packageName)
@@ -627,7 +608,7 @@ packageStatus installedPkgIndex cpkg =
 
 printPlan :: Bool -- is dry run
           -> Verbosity
-          -> [(ReadyPackage ConfiguredPackage ipkg, PackageStatus)]
+          -> [(ReadyPackage, PackageStatus)]
           -> SourcePackageDb
           -> IO ()
 printPlan dryRun verbosity plan sourcePkgDb = case plan of
@@ -784,9 +765,7 @@ theSpecifiedPackage pkgSpec =
 postInstallActions :: Verbosity
                    -> InstallArgs
                    -> [UserTarget]
-                   -> InstallPlan InstalledPackageInfo
-                                  ConfiguredPackage
-                                  BuildSuccess BuildFailure
+                   -> InstallPlan
                    -> IO ()
 postInstallActions verbosity
   (packageDBs, _, comp, platform, conf, useSandbox, mSandboxPkgInfo
@@ -867,7 +846,7 @@ regenerateHaddockIndex :: Verbosity
                        -> UseSandbox
                        -> ConfigFlags
                        -> InstallFlags
-                       -> InstallPlan ipkg srcpkg BuildSuccess ifailure
+                       -> InstallPlan
                        -> IO ()
 regenerateHaddockIndex verbosity packageDBs comp platform conf useSandbox
                        configFlags installFlags installPlan
@@ -926,9 +905,7 @@ symlinkBinaries :: Verbosity
                 -> Platform -> Compiler
                 -> ConfigFlags
                 -> InstallFlags
-                -> InstallPlan InstalledPackageInfo
-                               ConfiguredPackage
-                               iresult ifailure
+                -> InstallPlan
                 -> IO ()
 symlinkBinaries verbosity platform comp configFlags installFlags plan = do
   failed <- InstallSymlink.symlinkBinaries platform comp
@@ -955,8 +932,7 @@ symlinkBinaries verbosity platform comp configFlags installFlags plan = do
     bindir = fromFlag (installSymlinkBinDir installFlags)
 
 
-printBuildFailures :: Package srcpkg
-                   => InstallPlan ipkg srcpkg iresult BuildFailure
+printBuildFailures :: InstallPlan
                    -> IO ()
 printBuildFailures plan =
   case [ (pkg, reason)
@@ -1002,8 +978,7 @@ printBuildFailures plan =
 -- update the timestamps of those deps.
 updateSandboxTimestampsFile :: UseSandbox -> Maybe SandboxPackageInfo
                             -> Compiler -> Platform
-                            -> InstallPlan ipkg ConfiguredPackage
-                                           iresult ifailure
+                            -> InstallPlan
                             -> IO ()
 updateSandboxTimestampsFile (UseSandbox sandboxDir)
                             (Just (SandboxPackageInfo _ _ _ allAddSourceDeps))
@@ -1036,12 +1011,8 @@ type UseLogFile = Maybe (PackageIdentifier -> LibraryName -> FilePath, Verbosity
 performInstallations :: Verbosity
                      -> InstallArgs
                      -> InstalledPackageIndex
-                     -> InstallPlan InstalledPackageInfo
-                                    ConfiguredPackage
-                                    BuildSuccess BuildFailure
-                     -> IO (InstallPlan InstalledPackageInfo
-                                        ConfiguredPackage
-                                        BuildSuccess BuildFailure)
+                     -> InstallPlan
+                     -> IO InstallPlan
 performInstallations verbosity
   (packageDBs, _, comp, platform, conf, useSandbox, _,
    globalFlags, configFlags, configExFlags, installFlags, haddockFlags)
@@ -1158,15 +1129,9 @@ executeInstallPlan :: Verbosity
                    -> Compiler
                    -> JobControl IO (PackageId, LibraryName, BuildResult)
                    -> UseLogFile
-                   -> InstallPlan InstalledPackageInfo
-                                  ConfiguredPackage
-                                  BuildSuccess BuildFailure
-                   -> (ReadyPackage ConfiguredPackage
-                                    InstalledPackageInfo
-                       -> IO BuildResult)
-                   -> IO (InstallPlan InstalledPackageInfo
-                                      ConfiguredPackage
-                                      BuildSuccess BuildFailure)
+                   -> InstallPlan
+                   -> (ReadyPackage -> IO BuildResult)
+                   -> IO InstallPlan
 executeInstallPlan verbosity comp jobCtl useLogFile plan0 installPkg =
     tryNewTasks 0 plan0
   where
@@ -1196,11 +1161,8 @@ executeInstallPlan verbosity comp jobCtl useLogFile plan0 installPkg =
           plan'      = updatePlan pkgid buildResult plan
       tryNewTasks taskCount' plan'
 
-    updatePlan :: PackageIdentifier -> BuildResult
-               -> InstallPlan InstalledPackageInfo ConfiguredPackage
-                              BuildSuccess BuildFailure
-               -> InstallPlan InstalledPackageInfo ConfiguredPackage
-                              BuildSuccess BuildFailure
+    updatePlan :: PackageIdentifier -> BuildResult -> InstallPlan
+               -> InstallPlan
     updatePlan pkgid (Right buildSuccess@(BuildOk _ _ mipkg)) =
         InstallPlan.completed (Source.fakeInstalledPackageId pkgid)
                               mipkg buildSuccess
@@ -1243,8 +1205,7 @@ executeInstallPlan verbosity comp jobCtl useLogFile plan0 installPkg =
 -- 'configurePackage' in D.C.Configure.
 installReadyPackage :: Platform -> CompilerInfo
                     -> ConfigFlags
-                    -> ReadyPackage ConfiguredPackage
-                                    InstalledPackageInfo
+                    -> ReadyPackage
                     -> (ConfigFlags -> PackageLocation (Maybe FilePath)
                                     -> PackageDescription
                                     -> PackageDescriptionOverride
diff --git a/cabal-install/Distribution/Client/InstallPlan.hs b/cabal-install/Distribution/Client/InstallPlan.hs
index 902a56d215b3793e4604b75c2a0476d43616d07a..b6cb8384abfd72c8d926bd74093454af5a1a1c30 100644
--- a/cabal-install/Distribution/Client/InstallPlan.hs
+++ b/cabal-install/Distribution/Client/InstallPlan.hs
@@ -14,7 +14,9 @@
 -----------------------------------------------------------------------------
 module Distribution.Client.InstallPlan (
   InstallPlan,
-  PlanPackage(..),
+  GenericInstallPlan,
+  PlanPackage,
+  GenericPlanPackage(..),
 
   -- * Operations on 'InstallPlan's
   new,
@@ -42,11 +44,15 @@ module Distribution.Client.InstallPlan (
   dependencyClosure,
   ) where
 
+import Distribution.InstalledPackageInfo
+         ( InstalledPackageInfo )
 import Distribution.Package
          ( PackageIdentifier(..), PackageName(..), Package(..)
          , InstalledPackageId, HasInstalledPackageId(..) )
 import Distribution.Client.Types
-         ( PackageFixedDeps(..), ReadyPackage(..), fakeInstalledPackageId )
+         ( BuildSuccess, BuildFailure
+         , PackageFixedDeps(..), ConfiguredPackage
+         , GenericReadyPackage(..), fakeInstalledPackageId )
 import Distribution.Version
          ( Version )
 import Distribution.Client.ComponentDeps (ComponentDeps)
@@ -117,24 +123,28 @@ import qualified Data.Traversable as T
 
 -- | Packages in an install plan
 --
--- NOTE: 'ConfiguredPackage', 'ReadyPackage' and 'PlanPackage' intentionally
--- have no 'PackageInstalled' instance. `This is important: PackageInstalled
--- returns only library dependencies, but for package that aren't yet installed
--- we know many more kinds of dependencies (setup dependencies, exe, test-suite,
--- benchmark, ..). Any functions that operate on dependencies in cabal-install
--- should consider what to do with these dependencies; if we give a
--- 'PackageInstalled' instance it would be too easy to get this wrong (and,
--- for instance, call graph traversal functions from Cabal rather than from
--- cabal-install). Instead, see 'PackageFixedDeps'.
-data PlanPackage ipkg srcpkg iresult ifailure
+-- NOTE: 'ConfiguredPackage', 'GenericReadyPackage' and 'GenericPlanPackage'
+-- intentionally have no 'PackageInstalled' instance. `This is important:
+-- PackageInstalled returns only library dependencies, but for package that
+-- aren't yet installed we know many more kinds of dependencies (setup
+-- dependencies, exe, test-suite, benchmark, ..). Any functions that operate on
+-- dependencies in cabal-install should consider what to do with these
+-- dependencies; if we give a 'PackageInstalled' instance it would be too easy
+-- to get this wrong (and, for instance, call graph traversal functions from
+-- Cabal rather than from cabal-install). Instead, see 'PackageFixedDeps'.
+data GenericPlanPackage ipkg srcpkg iresult ifailure
    = PreExisting ipkg
    | Configured  srcpkg
-   | Processing  (ReadyPackage srcpkg ipkg)
-   | Installed   (ReadyPackage srcpkg ipkg) (Maybe ipkg) iresult
+   | Processing  (GenericReadyPackage srcpkg ipkg)
+   | Installed   (GenericReadyPackage srcpkg ipkg) (Maybe ipkg) iresult
    | Failed      srcpkg ifailure
 
+type PlanPackage = GenericPlanPackage
+                   InstalledPackageInfo ConfiguredPackage
+                   BuildSuccess BuildFailure
+
 instance (Package ipkg, Package srcpkg) =>
-         Package (PlanPackage ipkg srcpkg iresult ifailure) where
+         Package (GenericPlanPackage ipkg srcpkg iresult ifailure) where
   packageId (PreExisting ipkg)     = packageId ipkg
   packageId (Configured  spkg)     = packageId spkg
   packageId (Processing  rpkg)     = packageId rpkg
@@ -143,7 +153,7 @@ instance (Package ipkg, Package srcpkg) =>
 
 instance (PackageFixedDeps srcpkg,
           PackageFixedDeps ipkg, HasInstalledPackageId ipkg) =>
-         PackageFixedDeps (PlanPackage ipkg srcpkg iresult ifailure) where
+         PackageFixedDeps (GenericPlanPackage ipkg srcpkg iresult ifailure) where
   depends (PreExisting pkg)     = depends pkg
   depends (Configured  pkg)     = depends pkg
   depends (Processing  pkg)     = depends pkg
@@ -151,7 +161,8 @@ instance (PackageFixedDeps srcpkg,
   depends (Failed      pkg   _) = depends pkg
 
 instance (HasInstalledPackageId ipkg, HasInstalledPackageId srcpkg) =>
-         HasInstalledPackageId (PlanPackage ipkg srcpkg iresult ifailure) where
+         HasInstalledPackageId
+         (GenericPlanPackage ipkg srcpkg iresult ifailure) where
   installedPackageId (PreExisting ipkg ) = installedPackageId ipkg
   installedPackageId (Configured  spkg)  = installedPackageId spkg
   installedPackageId (Processing  rpkg)  = installedPackageId rpkg
@@ -161,22 +172,28 @@ instance (HasInstalledPackageId ipkg, HasInstalledPackageId srcpkg) =>
   installedPackageId (Failed      spkg        _) = installedPackageId spkg
 
 
-data InstallPlan ipkg srcpkg iresult ifailure = InstallPlan {
+data GenericInstallPlan ipkg srcpkg iresult ifailure = GenericInstallPlan {
     planIndex      :: (PlanIndex ipkg srcpkg iresult ifailure),
     planFakeMap    :: FakeMap,
     planGraph      :: Graph,
     planGraphRev   :: Graph,
-    planPkgOf      :: Graph.Vertex -> PlanPackage ipkg srcpkg iresult ifailure,
+    planPkgOf      :: Graph.Vertex
+                      -> GenericPlanPackage ipkg srcpkg iresult ifailure,
     planVertexOf   :: InstalledPackageId -> Graph.Vertex,
     planIndepGoals :: Bool
   }
 
+-- | 'GenericInstallPlan' specialised to most commonly used types.
+type InstallPlan = GenericInstallPlan
+                   InstalledPackageInfo ConfiguredPackage
+                   BuildSuccess BuildFailure
+
 type PlanIndex ipkg srcpkg iresult ifailure =
-     PackageIndex (PlanPackage ipkg srcpkg iresult ifailure)
+     PackageIndex (GenericPlanPackage ipkg srcpkg iresult ifailure)
 
 invariant :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
               HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
-          => InstallPlan ipkg srcpkg iresult ifailure -> Bool
+          => GenericInstallPlan ipkg srcpkg iresult ifailure -> Bool
 invariant plan =
     valid (planFakeMap plan)
           (planIndepGoals plan)
@@ -195,13 +212,13 @@ showPlanIndex index =
                 ++ display (installedPackageId p) ++ ")"
 
 showInstallPlan :: (HasInstalledPackageId ipkg, HasInstalledPackageId srcpkg)
-                => InstallPlan ipkg srcpkg iresult ifailure -> String
+                => GenericInstallPlan ipkg srcpkg iresult ifailure -> String
 showInstallPlan plan =
     showPlanIndex (planIndex plan) ++ "\n" ++
     "fake map:\n  " ++ intercalate "\n  " (map showKV (Map.toList (planFakeMap plan)))
   where showKV (k,v) = display k ++ " -> " ++ display v
 
-showPlanPackageTag :: PlanPackage ipkg srcpkg iresult ifailure -> String
+showPlanPackageTag :: GenericPlanPackage ipkg srcpkg iresult ifailure -> String
 showPlanPackageTag (PreExisting _)   = "PreExisting"
 showPlanPackageTag (Configured  _)   = "Configured"
 showPlanPackageTag (Processing  _)   = "Processing"
@@ -215,7 +232,7 @@ new :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
     => Bool
     -> PlanIndex ipkg srcpkg iresult ifailure
     -> Either [PlanProblem ipkg srcpkg iresult ifailure]
-              (InstallPlan ipkg srcpkg iresult ifailure)
+              (GenericInstallPlan ipkg srcpkg iresult ifailure)
 new indepGoals index =
   -- NB: Need to pre-initialize the fake-map with pre-existing
   -- packages
@@ -226,7 +243,7 @@ new indepGoals index =
               . filter isPreExisting
               $ PackageIndex.allPackages index in
   case problems fakeMap indepGoals index of
-    [] -> Right InstallPlan {
+    [] -> Right GenericInstallPlan {
             planIndex      = index,
             planFakeMap    = fakeMap,
             planGraph      = graph,
@@ -240,8 +257,8 @@ new indepGoals index =
             noSuchPkgId = internalError "package is not in the graph"
     probs -> Left probs
 
-toList :: InstallPlan ipkg srcpkg iresult ifailure
-       -> [PlanPackage ipkg srcpkg iresult ifailure]
+toList :: GenericInstallPlan ipkg srcpkg iresult ifailure
+       -> [GenericPlanPackage ipkg srcpkg iresult ifailure]
 toList = PackageIndex.allPackages . planIndex
 
 -- | Remove packages from the install plan. This will result in an
@@ -252,10 +269,10 @@ toList = PackageIndex.allPackages . planIndex
 --
 remove :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
            HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
-       => (PlanPackage ipkg srcpkg iresult ifailure -> Bool)
-       -> InstallPlan ipkg srcpkg iresult ifailure
+       => (GenericPlanPackage ipkg srcpkg iresult ifailure -> Bool)
+       -> GenericInstallPlan ipkg srcpkg iresult ifailure
        -> Either [PlanProblem ipkg srcpkg iresult ifailure]
-                 (InstallPlan ipkg srcpkg iresult ifailure)
+                 (GenericInstallPlan ipkg srcpkg iresult ifailure)
 remove shouldRemove plan =
     new (planIndepGoals plan) newIndex
   where
@@ -267,8 +284,8 @@ remove shouldRemove plan =
 -- The plan is complete if the result is @[]@.
 --
 ready :: forall ipkg srcpkg iresult ifailure. PackageFixedDeps srcpkg
-      => InstallPlan ipkg srcpkg iresult ifailure
-      -> [ReadyPackage srcpkg ipkg]
+      => GenericInstallPlan ipkg srcpkg iresult ifailure
+      -> [GenericReadyPackage srcpkg ipkg]
 ready plan = assert check readyPackages
   where
     check = if null readyPackages && null processingPackages
@@ -277,7 +294,7 @@ ready plan = assert check readyPackages
     configuredPackages = [ pkg | Configured pkg <- toList plan ]
     processingPackages = [ pkg | Processing pkg <- toList plan]
 
-    readyPackages :: [ReadyPackage srcpkg ipkg]
+    readyPackages :: [GenericReadyPackage srcpkg ipkg]
     readyPackages =
       [ ReadyPackage srcpkg deps
       | srcpkg <- configuredPackages
@@ -310,9 +327,9 @@ ready plan = assert check readyPackages
 --
 processing :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
                HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
-           => [ReadyPackage srcpkg ipkg]
-           -> InstallPlan ipkg srcpkg iresult ifailure
-           -> InstallPlan ipkg srcpkg iresult ifailure
+           => [GenericReadyPackage srcpkg ipkg]
+           -> GenericInstallPlan ipkg srcpkg iresult ifailure
+           -> GenericInstallPlan ipkg srcpkg iresult ifailure
 processing pkgs plan = assert (invariant plan') plan'
   where
     plan' = plan {
@@ -330,8 +347,8 @@ completed :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
               HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
           => InstalledPackageId
           -> Maybe ipkg -> iresult
-          -> InstallPlan ipkg srcpkg iresult ifailure
-          -> InstallPlan ipkg srcpkg iresult ifailure
+          -> GenericInstallPlan ipkg srcpkg iresult ifailure
+          -> GenericInstallPlan ipkg srcpkg iresult ifailure
 completed pkgid mipkg buildResult plan = assert (invariant plan') plan'
   where
     plan'     = plan {
@@ -360,8 +377,8 @@ failed :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
        => InstalledPackageId -- ^ The id of the package that failed to install
        -> ifailure           -- ^ The build result to use for the failed package
        -> ifailure           -- ^ The build result to use for its dependencies
-       -> InstallPlan ipkg srcpkg iresult ifailure
-       -> InstallPlan ipkg srcpkg iresult ifailure
+       -> GenericInstallPlan ipkg srcpkg iresult ifailure
+       -> GenericInstallPlan ipkg srcpkg iresult ifailure
 failed pkgid buildResult buildResult' plan = assert (invariant plan') plan'
   where
     -- NB: failures don't update IPIDs
@@ -377,9 +394,9 @@ failed pkgid buildResult buildResult' plan = assert (invariant plan') plan'
 
 -- | Lookup the reachable packages in the reverse dependency graph.
 --
-packagesThatDependOn :: InstallPlan ipkg srcpkg iresult ifailure
+packagesThatDependOn :: GenericInstallPlan ipkg srcpkg iresult ifailure
                      -> InstalledPackageId
-                     -> [PlanPackage ipkg srcpkg iresult ifailure]
+                     -> [GenericPlanPackage ipkg srcpkg iresult ifailure]
 packagesThatDependOn plan pkgid = map (planPkgOf plan)
                           . tail
                           . Graph.reachable (planGraphRev plan)
@@ -388,9 +405,9 @@ packagesThatDependOn plan pkgid = map (planPkgOf plan)
 
 -- | Lookup a package that we expect to be in the processing state.
 --
-lookupProcessingPackage :: InstallPlan ipkg srcpkg iresult ifailure
+lookupProcessingPackage :: GenericInstallPlan ipkg srcpkg iresult ifailure
                         -> InstalledPackageId
-                        -> ReadyPackage srcpkg ipkg
+                        -> GenericReadyPackage srcpkg ipkg
 lookupProcessingPackage plan pkgid =
   -- NB: processing packages are guaranteed to not indirect through
   -- planFakeMap
@@ -401,7 +418,7 @@ lookupProcessingPackage plan pkgid =
 -- | Check a package that we expect to be in the configured or failed state.
 --
 checkConfiguredPackage :: (Package srcpkg, Package ipkg)
-                       => PlanPackage ipkg srcpkg iresult ifailure
+                       => GenericPlanPackage ipkg srcpkg iresult ifailure
                        -> Maybe srcpkg
 checkConfiguredPackage (Configured pkg) = Just pkg
 checkConfiguredPackage (Failed     _ _) = Nothing
@@ -427,12 +444,12 @@ valid fakeMap indepGoals index =
     null $ problems fakeMap indepGoals index
 
 data PlanProblem ipkg srcpkg iresult ifailure =
-     PackageMissingDeps   (PlanPackage ipkg srcpkg iresult ifailure)
+     PackageMissingDeps   (GenericPlanPackage ipkg srcpkg iresult ifailure)
                           [PackageIdentifier]
-   | PackageCycle         [PlanPackage ipkg srcpkg iresult ifailure]
+   | PackageCycle         [GenericPlanPackage ipkg srcpkg iresult ifailure]
    | PackageInconsistency PackageName [(PackageIdentifier, Version)]
-   | PackageStateInvalid  (PlanPackage ipkg srcpkg iresult ifailure)
-                          (PlanPackage ipkg srcpkg iresult ifailure)
+   | PackageStateInvalid  (GenericPlanPackage ipkg srcpkg iresult ifailure)
+                          (GenericPlanPackage ipkg srcpkg iresult ifailure)
 
 showPlanProblem :: (Package ipkg, Package srcpkg)
                 => PlanProblem ipkg srcpkg iresult ifailure -> String
@@ -538,8 +555,8 @@ consistent fakeMap = null . PlanIndex.dependencyInconsistencies fakeMap False
 -- this relation. That is for very case where package @a@ depends on
 -- package @b@ we require that @dependencyStatesOk a b = True@.
 --
-stateDependencyRelation :: PlanPackage ipkg srcpkg iresult ifailure
-                        -> PlanPackage ipkg srcpkg iresult ifailure
+stateDependencyRelation :: GenericPlanPackage ipkg srcpkg iresult ifailure
+                        -> GenericPlanPackage ipkg srcpkg iresult ifailure
                         -> Bool
 stateDependencyRelation (PreExisting _) (PreExisting _)   = True
 
@@ -571,10 +588,10 @@ stateDependencyRelation _               _                 = False
 -- See `Distribution.Client.PlanIndex.dependencyClosure`
 dependencyClosure :: (HasInstalledPackageId ipkg,   PackageFixedDeps ipkg,
                       HasInstalledPackageId srcpkg, PackageFixedDeps srcpkg)
-                  => InstallPlan ipkg srcpkg iresult ifailure
+                  => GenericInstallPlan ipkg srcpkg iresult ifailure
                   -> [PackageIdentifier]
-                  -> Either [(PlanPackage ipkg srcpkg iresult ifailure, [InstalledPackageId])]
-                            (PackageIndex (PlanPackage ipkg srcpkg iresult ifailure))
+                  -> Either [(GenericPlanPackage ipkg srcpkg iresult ifailure, [InstalledPackageId])]
+                            (PackageIndex (GenericPlanPackage ipkg srcpkg iresult ifailure))
 dependencyClosure installPlan pids =
     PlanIndex.dependencyClosure
       (planFakeMap installPlan)
diff --git a/cabal-install/Distribution/Client/InstallSymlink.hs b/cabal-install/Distribution/Client/InstallSymlink.hs
index ceb03fb94a529882bbf87a5475818b3cbeed0afc..25da22604d1c95a104b1551e0ebc641a9c6fbb9e 100644
--- a/cabal-install/Distribution/Client/InstallSymlink.hs
+++ b/cabal-install/Distribution/Client/InstallSymlink.hs
@@ -40,7 +40,8 @@ symlinkBinary _ _ _ _ = fail "Symlinking feature not available on Windows"
 #else
 
 import Distribution.Client.Types
-         ( SourcePackage(..), ReadyPackage(..), enableStanzas
+         ( SourcePackage(..)
+         , GenericReadyPackage(..), ReadyPackage, enableStanzas
          , ConfiguredPackage(..) )
 import Distribution.Client.Setup
          ( InstallFlags(installSymlinkBinDir) )
@@ -61,8 +62,6 @@ import Distribution.PackageDescription.Configuration
 import Distribution.Simple.Setup
          ( ConfigFlags(..), fromFlag, fromFlagOrDefault, flagToMaybe )
 import qualified Distribution.Simple.InstallDirs as InstallDirs
-import Distribution.InstalledPackageInfo
-         ( InstalledPackageInfo )
 import qualified Distribution.InstalledPackageInfo as Installed
 import Distribution.Simple.Compiler
          ( Compiler, compilerInfo, CompilerInfo(..), packageKeySupported )
@@ -109,9 +108,7 @@ import Data.Maybe
 symlinkBinaries :: Platform -> Compiler
                 -> ConfigFlags
                 -> InstallFlags
-                -> InstallPlan InstalledPackageInfo
-                               ConfiguredPackage
-                               iresult ifailure
+                -> InstallPlan
                 -> IO [(PackageIdentifier, String, FilePath)]
 symlinkBinaries platform comp configFlags installFlags plan =
   case flagToMaybe (installSymlinkBinDir installFlags) of
@@ -148,7 +145,7 @@ symlinkBinaries platform comp configFlags installFlags plan =
       , exe <- PackageDescription.executables pkg
       , PackageDescription.buildable (PackageDescription.buildInfo exe) ]
 
-    pkgDescription :: ReadyPackage ConfiguredPackage ipkg -> PackageDescription
+    pkgDescription :: ReadyPackage -> PackageDescription
     pkgDescription (ReadyPackage (ConfiguredPackage
                                     (SourcePackage _ pkg _ _)
                                     flags stanzas _)
diff --git a/cabal-install/Distribution/Client/Types.hs b/cabal-install/Distribution/Client/Types.hs
index 5eb05606c80b6493ff6ed5689068883f46719930..a5991d88e23115a015cea41847b650208f988dc0 100644
--- a/cabal-install/Distribution/Client/Types.hs
+++ b/cabal-install/Distribution/Client/Types.hs
@@ -131,38 +131,36 @@ instance HasInstalledPackageId ConfiguredPackage where
 
 -- | Like 'ConfiguredPackage', but with all dependencies guaranteed to be
 -- installed already, hence itself ready to be installed.
-data ReadyPackage srcpkg ipkg
+data GenericReadyPackage srcpkg ipkg
    = ReadyPackage
        srcpkg                  -- see 'ConfiguredPackage'.
        (ComponentDeps [ipkg])  -- Installed dependencies.
   deriving (Eq, Show)
 
-instance Package srcpkg => Package (ReadyPackage srcpkg ipkg) where
+type ReadyPackage = GenericReadyPackage ConfiguredPackage InstalledPackageInfo
+
+instance Package srcpkg => Package (GenericReadyPackage srcpkg ipkg) where
   packageId (ReadyPackage srcpkg _deps) = packageId srcpkg
 
 instance (Package srcpkg, HasInstalledPackageId ipkg) =>
-         PackageFixedDeps (ReadyPackage srcpkg ipkg) where
+         PackageFixedDeps (GenericReadyPackage srcpkg ipkg) where
   depends (ReadyPackage _ deps) = fmap (map installedPackageId) deps
 
 instance HasInstalledPackageId srcpkg =>
-         HasInstalledPackageId (ReadyPackage srcpkg ipkg) where
+         HasInstalledPackageId (GenericReadyPackage srcpkg ipkg) where
   installedPackageId (ReadyPackage pkg _) = installedPackageId pkg
 
 
 -- | Extracts a package key from ReadyPackage, a common operation needed
 -- to calculate build paths.
-readyPackageKey :: Compiler
-                -> ReadyPackage ConfiguredPackage InstalledPackageInfo
-                -> PackageKey
+readyPackageKey :: Compiler -> ReadyPackage -> PackageKey
 readyPackageKey comp (ReadyPackage pkg deps) =
     mkPackageKey (packageKeySupported comp) (packageId pkg)
                  (map Info.libraryName (CD.nonSetupDeps deps))
 
 -- | Extracts a library name from ReadyPackage, a common operation needed
 -- to calculate build paths.
-readyLibraryName :: Compiler
-                 -> ReadyPackage ConfiguredPackage InstalledPackageInfo
-                 -> LibraryName
+readyLibraryName :: Compiler -> ReadyPackage -> LibraryName
 readyLibraryName comp ready@(ReadyPackage pkg _) =
     packageKeyLibraryName (packageId pkg) (readyPackageKey comp ready)
 
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs b/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs
index b7a9e97809e0749e2f36eefcb12b2730e34baf8b..e5e3dd6e5825adc7446b29e6c88fed5413933cc7 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs
@@ -261,11 +261,7 @@ exInstIdx = C.PackageIndex.fromList . map exInstInfo
 exResolve :: ExampleDb
           -> [ExamplePkgName]
           -> Bool
-          -> ([String], Either String
-                               (CI.InstallPlan.InstallPlan
-                                    C.InstalledPackageInfo
-                                    ConfiguredPackage
-                                    isuccess ifailure))
+          -> ([String], Either String CI.InstallPlan.InstallPlan)
 exResolve db targets indepGoals = runProgress $
     resolveDependencies C.buildPlatform
                         (C.unknownCompilerInfo C.buildCompilerId C.NoAbiTag)
@@ -286,14 +282,11 @@ exResolve db targets indepGoals = runProgress $
                        depResolverIndependentGoals = indepGoals
                      }
 
-extractInstallPlan :: CI.InstallPlan.InstallPlan ipkg ConfiguredPackage
-                                                 isuccess ifailure
+extractInstallPlan :: CI.InstallPlan.InstallPlan
                    -> [(ExamplePkgName, ExamplePkgVersion)]
 extractInstallPlan = catMaybes . map confPkg . CI.InstallPlan.toList
   where
-    confPkg :: CI.InstallPlan.PlanPackage ipkg ConfiguredPackage
-                                          isuccess ifailure
-            -> Maybe (String, Int)
+    confPkg :: CI.InstallPlan.PlanPackage -> Maybe (String, Int)
     confPkg (CI.InstallPlan.Configured pkg) = Just $ srcPkg pkg
     confPkg _                               = Nothing