diff --git a/Distribution/Cab/Commands.hs b/Distribution/Cab/Commands.hs
--- a/Distribution/Cab/Commands.hs
+++ b/Distribution/Cab/Commands.hs
@@ -126,9 +126,9 @@
 
 getDirs :: (String,String) -> [String] -> IO [FilePath]
 getDirs (name,ver) sandboxOpts = do
-    libdirs <- queryGhcPkg "library-dirs"
+    importDirs <- queryGhcPkg "import-dirs"
     haddock <- map docDir <$> queryGhcPkg "haddock-html"
-    return $ topDir $ libdirs ++ haddock
+    return $ topDir $ importDirs ++ haddock
   where
     nameVer = name ++ "-" ++ ver
     queryGhcPkg field = do
diff --git a/Distribution/Cab/PkgDB.hs b/Distribution/Cab/PkgDB.hs
--- a/Distribution/Cab/PkgDB.hs
+++ b/Distribution/Cab/PkgDB.hs
@@ -21,12 +21,12 @@
   , verOfPkgInfo
   ) where
 
-import Distribution.Cab.Utils (fromDotted)
+import Distribution.Cab.Utils (fromDotted, installedUnitId)
 import Distribution.Cab.Version
 import Distribution.Cab.VerDB (PkgName)
 import Distribution.Version (Version(..))
 import Distribution.InstalledPackageInfo
-    (InstalledPackageInfo_(..), InstalledPackageInfo)
+    (InstalledPackageInfo, sourcePackageId)
 import Distribution.Package (PackageName(..), PackageIdentifier(..))
 import Distribution.Simple.Compiler (PackageDB(..))
 import Distribution.Simple.GHC (configure, getInstalledPackages, getPackageDBContents)
@@ -74,8 +74,12 @@
 
 getDBs :: [PackageDB] -> IO PkgDB
 getDBs specs = do
-    (_,_,pro) <- configure normal Nothing Nothing defaultProgramDb
-    getInstalledPackages normal specs pro
+    (_comp,_,pro) <- configure normal Nothing Nothing defaultProgramDb
+    getInstalledPackages normal
+#if MIN_VERSION_Cabal(1,23,0)
+                         _comp
+#endif
+                         specs pro
 
 getDB :: PackageDB -> IO PkgDB
 getDB spec = do
@@ -130,7 +134,7 @@
 ----------------------------------------------------------------
 
 topSortedPkgs :: PkgInfo -> PkgDB -> [PkgInfo]
-topSortedPkgs pkgi db = topSort $ pkgids [pkgi]
+topSortedPkgs pkgi db = topSort $ unitids [pkgi]
   where
-    pkgids = map installedPackageId
+    unitids = map installedUnitId
     topSort = topologicalOrder . fromList . reverseDependencyClosure db
diff --git a/Distribution/Cab/Printer.hs b/Distribution/Cab/Printer.hs
--- a/Distribution/Cab/Printer.hs
+++ b/Distribution/Cab/Printer.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Distribution.Cab.Printer (
     printDeps
   , printRevDeps
@@ -11,21 +12,21 @@
 import qualified Data.Map as M
 import Distribution.Cab.PkgDB
 import Distribution.Cab.Version
-import Distribution.InstalledPackageInfo (InstalledPackageInfo_(..))
+import Distribution.Cab.Utils (UnitId, installedUnitId, lookupUnitId)
+import Distribution.InstalledPackageInfo (author, depends, license)
 import Distribution.License (License(..))
-import Distribution.Package (InstalledPackageId)
-import Distribution.Simple.PackageIndex (lookupInstalledPackageId, allPackages)
+import Distribution.Simple.PackageIndex (allPackages)
 
 ----------------------------------------------------------------
 
-type RevDB = Map InstalledPackageId [InstalledPackageId]
+type RevDB = Map UnitId [UnitId]
 
 makeRevDepDB :: PkgDB -> RevDB
 makeRevDepDB db = M.fromList revdeps
   where
     pkgs = allPackages db
     deps = map idDeps pkgs
-    idDeps pkg = (installedPackageId pkg, depends pkg)
+    idDeps pkg = (installedUnitId pkg, depends pkg)
     kvs = sort $ concatMap decomp deps
     decomp (k,vs) = map (\v -> (v,k)) vs
     kvss = groupBy ((==) `on` fst) kvs
@@ -37,14 +38,14 @@
 printDeps :: Bool -> Bool -> PkgDB -> Int -> PkgInfo -> IO ()
 printDeps rec info db n pkgi = mapM_ (printDep rec info db n) $ depends pkgi
 
-printDep :: Bool -> Bool -> PkgDB -> Int -> InstalledPackageId -> IO ()
-printDep rec info db n pid = case lookupInstalledPackageId db pid of
-    Nothing   -> return ()
-    Just pkgi -> do
-        putStr $ prefix ++ fullNameOfPkgInfo pkgi
-        extraInfo info pkgi
+printDep :: Bool -> Bool -> PkgDB -> Int -> UnitId -> IO ()
+printDep rec info db n uid = case lookupUnitId db uid of
+    Nothing    -> return ()
+    Just uniti -> do
+        putStr $ prefix ++ fullNameOfPkgInfo uniti
+        extraInfo info uniti
         putStrLn ""
-        when rec $ printDeps rec info db (n+1) pkgi
+        when rec $ printDeps rec info db (n+1) uniti
   where
     prefix = replicate (n * 4) ' '
 
@@ -56,20 +57,20 @@
     revdb = makeRevDepDB db
 
 printRevDeps' :: Bool -> Bool -> PkgDB -> RevDB -> Int -> PkgInfo -> IO ()
-printRevDeps' rec info db revdb n pkgi = case M.lookup pkgid revdb of
+printRevDeps' rec info db revdb n pkgi = case M.lookup unitid revdb of
     Nothing -> return ()
-    Just pkgids -> mapM_ (printRevDep' rec info db revdb n) pkgids
+    Just unitids -> mapM_ (printRevDep' rec info db revdb n) unitids
   where
-    pkgid = installedPackageId pkgi
+    unitid = installedUnitId pkgi
 
-printRevDep' :: Bool -> Bool -> PkgDB -> RevDB -> Int -> InstalledPackageId -> IO ()
-printRevDep' rec info db revdb n pid = case lookupInstalledPackageId db pid of
-    Nothing   -> return ()
-    Just pkgi -> do
-        putStr $ prefix ++ fullNameOfPkgInfo pkgi
-        extraInfo info pkgi
+printRevDep' :: Bool -> Bool -> PkgDB -> RevDB -> Int -> UnitId -> IO ()
+printRevDep' rec info db revdb n uid = case lookupUnitId db uid of
+    Nothing    -> return ()
+    Just uniti -> do
+        putStr $ prefix ++ fullNameOfPkgInfo uniti
+        extraInfo info uniti
         putStrLn ""
-        when rec $ printRevDeps' rec info db revdb (n+1) pkgi
+        when rec $ printRevDeps' rec info db revdb (n+1) uniti
   where
     prefix = replicate (n * 4) ' '
 
diff --git a/Distribution/Cab/Utils.hs b/Distribution/Cab/Utils.hs
--- a/Distribution/Cab/Utils.hs
+++ b/Distribution/Cab/Utils.hs
@@ -1,7 +1,27 @@
+{-# LANGUAGE CPP #-}
 module Distribution.Cab.Utils where
 
 import Data.List
 
+import Distribution.InstalledPackageInfo (InstalledPackageInfo)
+#if MIN_VERSION_Cabal(1,21,0) && !(MIN_VERSION_Cabal(1,23,0))
+import Distribution.Package (PackageInstalled)
+#endif
+import Distribution.Simple.PackageIndex (PackageIndex)
+#if MIN_VERSION_Cabal(1,23,0)
+import qualified Distribution.InstalledPackageInfo as Cabal
+    (installedUnitId)
+import qualified Distribution.Package as Cabal (UnitId)
+import qualified Distribution.Simple.PackageIndex as Cabal
+    (lookupUnitId)
+#else
+import qualified Distribution.InstalledPackageInfo as Cabal
+    (installedPackageId)
+import qualified Distribution.Package as Cabal (InstalledPackageId)
+import qualified Distribution.Simple.PackageIndex as Cabal
+    (lookupInstalledPackageId)
+#endif
+
 -- |
 -- >>> fromDotted "1.2.3"
 -- [1,2,3]
@@ -16,3 +36,27 @@
 -- "1.2.3"
 toDotted :: [Int] -> String
 toDotted = intercalate "." . map show
+
+#if MIN_VERSION_Cabal(1,23,0)
+type UnitId = Cabal.UnitId
+#else
+type UnitId = Cabal.InstalledPackageId
+#endif
+
+installedUnitId :: InstalledPackageInfo -> UnitId
+#if MIN_VERSION_Cabal(1,23,0)
+installedUnitId = Cabal.installedUnitId
+#else
+installedUnitId = Cabal.installedPackageId
+#endif
+
+#if MIN_VERSION_Cabal(1,23,0)
+lookupUnitId :: PackageIndex a -> UnitId -> Maybe a
+lookupUnitId = Cabal.lookupUnitId
+#elif MIN_VERSION_Cabal(1,21,0)
+lookupUnitId :: PackageInstalled a => PackageIndex a -> UnitId -> Maybe a
+lookupUnitId = Cabal.lookupInstalledPackageId
+#else
+lookupUnitId :: PackageIndex -> UnitId -> Maybe InstalledPackageInfo
+lookupUnitId = Cabal.lookupInstalledPackageId
+#endif
diff --git a/cab.cabal b/cab.cabal
--- a/cab.cabal
+++ b/cab.cabal
@@ -1,5 +1,5 @@
 Name:                   cab
-Version:                0.2.15
+Version:                0.2.16
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -21,7 +21,7 @@
   Default-Language:     Haskell2010
   GHC-Options:          -Wall
   Build-Depends:        base >= 4.0 && < 5
-                      , Cabal >= 1.18 && < 1.23
+                      , Cabal >= 1.18 && < 1.25
                       , attoparsec >= 0.10
                       , bytestring
                       , conduit >= 1.1
