diff --git a/dependency.cabal b/dependency.cabal
--- a/dependency.cabal
+++ b/dependency.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.18
 name: dependency
-version: 1.0.0.0
+version: 1.1.0.0
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018 Vanessa McHale
@@ -35,15 +35,14 @@
     default-language: Haskell2010
     other-extensions: DeriveAnyClass DeriveGeneric OverloadedStrings
                       DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable
-                      OverloadedStrings TemplateHaskell TypeFamilies
+                      OverloadedStrings TemplateHaskell TypeFamilies TupleSections
     ghc-options: -Wall
     build-depends:
         base >=4.8 && <5,
         ansi-wl-pprint -any,
         containers >=0.5.9,
-        recursion-schemes -any,
-        lens -any,
-        transformers -any,
+        micro-recursion-schemes -any,
+        microlens -any,
         binary -any,
         deepseq -any
     
diff --git a/src/Data/Dependency.hs b/src/Data/Dependency.hs
--- a/src/Data/Dependency.hs
+++ b/src/Data/Dependency.hs
@@ -1,8 +1,8 @@
+{-# LANGUAGE TupleSections #-}
+
 module Data.Dependency
     ( -- * Functions
       resolveDependencies
-    , buildSequence
-    , check
     -- * Types
     , Dependency (..)
     , PackageSet (..)
@@ -50,22 +50,9 @@
           g (Just x') = Left (Conflicts (_libName <$> ds') (_libName x'))
             where ds' = filter (\d -> not (check x' [d])) ds
 
--- This does check for compatibility with past packages, but doesn't do the
--- fancy tardis shenanigans it's supposed to when package resolution fails.
 latest :: PackageSet Dependency -> [Dependency] -> Dependency -> DepM (String, Dependency)
-latest (PackageSet ps) ds d@(Dependency ln _ _) = do
-    s <- lookupMap ln ps
-    finish ln (lookupSet (Just d) ds s)
-
-finish :: String -> DepM Dependency -> DepM (String, Dependency)
-finish ln dep' =
-    case dep' of
-
-        Right dep ->
-            pure (ln, dep)
-
-        Left err ->
-            Left err
+latest (PackageSet ps) ds d@(Dependency ln _ _) =
+    (ln,) <$> (lookupSet (Just d) ds =<< lookupMap ln ps)
 
 -- | This splits dependencies into phases
 buildSequence :: [Dependency] -> [[Dependency]]
@@ -104,8 +91,11 @@
 -- 6. Present a solution whenever one exists.
 --
 -- This doesn't do any package resolution beyond versioning.
-resolveDependencies :: PackageSet Dependency -> [Dependency] -> DepM [[Dependency]]
-resolveDependencies ps = select . getLatest <=< fmap ((buildSequence &&& id) . toList) . saturate
+resolveDependencies :: PackageSet Dependency -- ^ Package set
+                    -> [Dependency] -- ^ Dependencies requested
+                    -> DepM [[Dependency]] -- ^ Phased build
+resolveDependencies ps = select . getLatest <=< fmap prepare . saturate
     where select = fmap (fmap (fmap snd))
           saturate = fmap S.unions . traverse (saturateDeps ps)
-          getLatest (p, q) = traverse (traverse (latest ps q)) p
+          prepare = (buildSequence &&& id) . toList
+          getLatest (stepped, allDeps) = traverse (traverse (latest ps allDeps)) stepped
diff --git a/src/Data/Dependency/Error.hs b/src/Data/Dependency/Error.hs
--- a/src/Data/Dependency/Error.hs
+++ b/src/Data/Dependency/Error.hs
@@ -16,11 +16,11 @@
 data ResolveError = InternalError
                   | NotPresent String
                   | Conflicts [String] String
+                  | CircularDependencies String String
                   deriving (Show, Eq, NFData, Generic)
-                  -- CircularDependencies String String
-                  -- Conflict String String (Constraint Version) (Constraint Version)
 
 instance Pretty ResolveError where
     pretty InternalError = red "Error:" <+> "the" <+> squotes "dependency" <+> "package enountered an internal error. Please report this as a bug:\n" <> hang 2 "https://hub.darcs.net/vmchale/ats/issues"
     pretty (NotPresent s) = red "Error:" <+> "the package" <+> squotes (text s) <+> "could not be found.\n"
     pretty (Conflicts ss s) = red "Error:" <+> "the package" <+> squotes (text s) <+> "conflicts with already in-scope packages: " <+> mconcat (punctuate ", " (fmap (squotes . text) ss))
+    pretty (CircularDependencies s s') = red "Error:" <+> "package" <+> squotes (text s) <+> "and package" <+> squotes (text s') <+> "form a cycle of dependencies"
diff --git a/src/Data/Dependency/Sort.hs b/src/Data/Dependency/Sort.hs
--- a/src/Data/Dependency/Sort.hs
+++ b/src/Data/Dependency/Sort.hs
@@ -1,9 +1,10 @@
 module Data.Dependency.Sort ( sortDeps
                             ) where
 
-import           Control.Lens
 import           Data.Dependency.Type
 import           Data.Graph
+import           Lens.Micro
+import           Lens.Micro.Extras
 
 asGraph :: [Dependency] -> (Graph, Vertex -> Dependency)
 asGraph ds = (f triple, keys)
diff --git a/src/Data/Dependency/Type.hs b/src/Data/Dependency/Type.hs
--- a/src/Data/Dependency/Type.hs
+++ b/src/Data/Dependency/Type.hs
@@ -38,7 +38,6 @@
     show (Version is) = intercalate "." (show <$> is)
 
 instance Ord Version where
-    (Version []) <= (Version []) = True
     (Version []) <= _ = True
     _ <= (Version []) = False
     (Version (x:xs)) <= (Version (y:ys))
@@ -70,16 +69,9 @@
                              }
                              deriving (Show, Eq, Ord, Generic, NFData)
 
-check' :: Dependency -> [Dependency] -> Bool
-check' (Dependency _ lds _) ds =
-    and [ compatible (Eq v') c | (Dependency ln _ v') <- ds, (str, c) <- lds, ln == str ]
-
 -- | Check a given dependency is compatible with in-scope dependencies.
 check :: Dependency -> [Dependency] -> Bool
-check d = (&&) <$> check' d <*> check'' d
-
-check'' :: Dependency -> [Dependency] -> Bool
-check'' (Dependency ln _ v) ds = and [ g ds' | (Dependency _ ds' _) <- ds ]
+check (Dependency ln _ v) ds = and [ g ds' | (Dependency _ ds' _) <- ds ]
     where g = all ((`satisfies` v) . snd) . filter ((== ln) . fst)
 
 satisfies :: (Ord a) => Constraint a -> a -> Bool
@@ -88,16 +80,6 @@
 satisfies (Eq x) y            = x == y
 satisfies (Bounded x y) z     = satisfies x z && satisfies y z
 satisfies None _              = True
-
-compatible :: (Ord a) => Constraint a -> Constraint a -> Bool
-compatible LessThanEq{} LessThanEq{}        = True
-compatible (LessThanEq x) (GreaterThanEq y) = y <= x
-compatible (Eq x) (Eq y)                    = x == y
-compatible (Bounded x y) z                  = compatible x z && compatible y z
-compatible GreaterThanEq{} GreaterThanEq{}  = True
-compatible (LessThanEq x) (Eq y)            = y <= x
-compatible None _                           = True
-compatible x y                              = compatible y x
 
 makeBaseFunctor ''Constraint
 
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -24,9 +24,6 @@
 ghcMod :: Dependency
 ghcMod = Dependency "ghc-mod" [("lens", LessThanEq defV)] defV
 
-deps :: [Dependency]
-deps = [free, lens, comonad]
-
 mapSingles :: [(d, b)] -> [(d, S.Set b)]
 mapSingles = fmap (second S.singleton)
 
@@ -36,12 +33,9 @@
         mapSingles [("ghc-mod", ghcMod), ("comonad", comonad), ("free", free)])
 
 main :: IO ()
-main = hspec $ parallel $ do
-    describe "buildSequence" $
-        it "correctly orders dependencies" $
-            buildSequence deps `shouldBe` [[free, comonad], [lens]]
+main = hspec $ parallel $
     describe "resolveDependencies" $ do
-        it "correctly resolves dependencies in a package set" $
-            resolveDependencies set [newLens] `shouldBe` Right [[free, comonad], [newLens]]
-        it "correctly resolves dependencies in a package set" $
-            resolveDependencies set [ghcMod] `shouldBe` Right [[free, comonad], [lens], [ghcMod]]
+    it "correctly resolves dependencies in a package set" $
+        resolveDependencies set [newLens] `shouldBe` Right [[free, comonad], [newLens]]
+    it "correctly resolves dependencies in a package set" $
+        resolveDependencies set [ghcMod] `shouldBe` Right [[free, comonad], [lens], [ghcMod]]
