diff --git a/Distribution/Simple/PackageIndex.hs b/Distribution/Simple/PackageIndex.hs
index eebb2cf2b3465b96b43229ec96dd78119b24cb41..57479be0526cfbfd9ce890c354c4cd0cf15d5e79 100644
--- a/Distribution/Simple/PackageIndex.hs
+++ b/Distribution/Simple/PackageIndex.hs
@@ -272,20 +272,18 @@ dependencyClosure :: PackageFixedDeps pkg
                   -> [PackageIdentifier]
                   -> Either (PackageIndex pkg)
                             [(pkg, [PackageIdentifier])]
-dependencyClosure index pkgids0 = case closure [] [] pkgids0 of
-  (completed, []) -> Left  $ fromList completed
-  (completed, _)  -> Right $ brokenPackages (fromList completed)
-
+dependencyClosure index pkgids0 = case closure mempty [] pkgids0 of
+  (completed, []) -> Left completed
+  (completed, _)  -> Right (brokenPackages completed)
   where
-    closure completed failed [] = (completed, failed)
+    closure completed failed []             = (completed, failed)
     closure completed failed (pkgid:pkgids) = case lookupPackageId index pkgid of
-      Nothing  -> closure completed (pkgid:failed) pkgids
-               -- TODO: use more effecient test here:
-      Just pkg | packageId pkg `elem` map packageId completed
-               -> closure      completed   failed  pkgids
-               | otherwise
-               -> closure (pkg:completed)  failed  pkgids'
-               where pkgids' = depends pkg ++ pkgids
+      Nothing   -> closure completed (pkgid:failed) pkgids
+      Just pkg  -> case lookupPackageId completed (packageId pkg) of
+        Just _  -> closure completed  failed pkgids
+        Nothing -> closure completed' failed pkgids'
+          where completed' = insert pkg completed
+                pkgids'    = depends pkg ++ pkgids
 
 -- | Given a package index where we assume we want to use all the packages
 -- (use 'dependencyClosure' if you need to get such a index subset) find out