diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,11 +1,16 @@
+0.1.1.1
+-------
+* Make `hackage-repo-tool` buildable on Windows (#175)
+* Fix build-failure w/ `directory-1.2`
+
 0.1.1
 -----
-* Update for hackage-security-0.5
+* Update for `hackage-security-0.5`
 
 0.1.0.1
 -------
 * Add missing module to other-modules (#100)
-* Allow for hackage-security-0.3
+* Allow for `hackage-security-0.3`
 * Include ChangeLog.md in sdist (#98)
 
 0.1.0.0
diff --git a/hackage-repo-tool.cabal b/hackage-repo-tool.cabal
--- a/hackage-repo-tool.cabal
+++ b/hackage-repo-tool.cabal
@@ -1,36 +1,44 @@
+cabal-version:       1.12
 name:                hackage-repo-tool
-version:             0.1.1
+version:             0.1.1.1
+
 synopsis:            Utility to manage secure file-based package repositories
-description:         This utility can be used to manage secure file-based
-                     repositories (creating TUF metadata as well as a Hackage
-                     index tarball). Currently it also provides various
-                     lower level utilities for creating and signing TUF files.
+description:         This utility can be used to manage secure file-based package
+                     repositories (creating [TUF](https://theupdateframework.github.io/)
+                     metadata as well as a Hackage index tarball) which can be used by
+                     clients such as [cabal-install](http://hackage.haskell.org/package/cabal-install).
+                     Currently it also provides various lower level utilities for creating
+                     and signing TUF files.
                      .
-                     This is part of the Hackage Security infrastructure.
-homepage:            http://github.com/well-typed/hackage-security/
+                     This is part of the [Hackage Security](https://github.com/haskell/hackage-security#readme)
+                     infrastructure.
 license:             BSD3
 license-file:        LICENSE
 author:              Edsko de Vries
-maintainer:          edsko@well-typed.com
+maintainer:          cabal-devel@haskell.org
 copyright:           Copyright 2015 Well-Typed LLP
 category:            Distribution
-homepage:            https://github.com/well-typed/hackage-security
-bug-reports:         https://github.com/well-typed/hackage-security/issues
+homepage:            https://github.com/haskell/hackage-security
+bug-reports:         https://github.com/haskell/hackage-security/issues
 build-type:          Simple
-cabal-version:       >=1.10
 
 extra-source-files:
   ChangeLog.md
 
 source-repository head
   type: git
-  location: https://github.com/well-typed/hackage-security.git
+  location: https://github.com/haskell/hackage-security.git
 
 flag use-network-uri
-  description: Are we using network-uri?
+  description: Are we using @network-uri@?
   manual: False
 
+flag use-old-time
+  description: Are we using @old-time@?
+  manual: False
+
 executable hackage-repo-tool
+  hs-source-dirs:      src
   main-is:             Main.hs
   other-modules:       Hackage.Security.RepoTool.Options
                        Hackage.Security.RepoTool.Layout
@@ -38,18 +46,33 @@
                        Hackage.Security.RepoTool.Paths
                        Hackage.Security.RepoTool.Util.IO
                        Prelude
-  build-depends:       base                 >= 4.4  && < 5,
-                       Cabal                >= 1.12 && < 1.25,
+
+  build-depends:       base                 >= 4.5  && < 5,
+                       Cabal                >= 1.14 && < 2.4,
                        bytestring           >= 0.9  && < 0.11,
-                       directory            >= 1.1  && < 1.3,
+                       directory            >= 1.1  && < 1.4,
                        filepath             >= 1.2  && < 1.5,
-                       optparse-applicative >= 0.11 && < 0.13,
-                       tar                  >= 0.4  && < 0.5,
-                       time                 >= 1.2  && < 1.6,
-                       unix                 >= 2.5  && < 2.8,
+                       optparse-applicative >= 0.11 && < 0.15,
+                       tar                  >= 0.4  && < 0.6,
+                       time                 >= 1.2  && < 1.9,
                        zlib                 >= 0.5  && < 0.7,
                        hackage-security     >= 0.5  && < 0.6
-  hs-source-dirs:      src
+  if !os(windows)
+    build-depends:     unix                 >= 2.5  && < 2.8
+
+  if flag(use-old-time)
+    build-depends: directory < 1.2
+                 , old-time == 1.1.*
+  else
+    build-depends: directory >= 1.2
+
+  -- see comments in hackage-security.cabal
+  if flag(use-network-uri)
+    build-depends: network-uri >= 2.6 && < 2.7,
+                   network     >= 2.6 && < 2.7
+  else
+    build-depends: network     >= 2.5 && < 2.6
+
   default-language:    Haskell2010
   default-extensions:  DeriveDataTypeable
                        FlexibleContexts
@@ -58,12 +81,5 @@
                        ScopedTypeVariables
                        StandaloneDeriving
                        RecordWildCards
-  other-extensions:    TemplateHaskell
-  ghc-options:         -Wall
 
-  -- see comments in hackage-security.cabal
-  if flag(use-network-uri)
-    build-depends: network-uri >= 2.6 && < 2.7,
-                   network     >= 2.6 && < 2.7
-  else
-    build-depends: network     >= 2.5 && < 2.6
+  ghc-options:         -Wall
diff --git a/src/Hackage/Security/RepoTool/Options.hs b/src/Hackage/Security/RepoTool/Options.hs
--- a/src/Hackage/Security/RepoTool/Options.hs
+++ b/src/Hackage/Security/RepoTool/Options.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Hackage.Security.RepoTool.Options (
     GlobalOpts(..)
   , Command(..)
@@ -60,8 +61,10 @@
     -- | Create mirrors metadata
   | CreateMirrors KeysLoc (Path Absolute) [URI]
 
+#ifndef mingw32_HOST_OS
     -- | Create a directory with symlinks in cabal-local-rep layout
   | SymlinkCabalLocalRepo RepoLoc RepoLoc
+#endif
 
     -- | Sign an individual file
   | Sign [KeyLoc] DeleteExistingSignatures (Path Absolute)
@@ -123,6 +126,7 @@
         ])
   <*> (many $ argument (str >>= readURI) (metavar "MIRROR"))
 
+#ifndef mingw32_HOST_OS
 parseSymlinkCabalLocalRepo :: Parser Command
 parseSymlinkCabalLocalRepo = SymlinkCabalLocalRepo
   <$> parseRepoLoc
@@ -130,6 +134,7 @@
           long "cabal-repo"
         , help "Location of the cabal repo"
         ])
+#endif
 
 parseSign :: Parser Command
 parseSign = Sign
@@ -181,8 +186,10 @@
             progDesc "Create root metadata"
         , command "create-mirrors" $ info (helper <*> parseCreateMirrors) $
             progDesc "Create mirrors metadata. All MIRRORs specified on the command line will be written to the file."
+#ifndef mingw32_HOST_OS
         , command "symlink-cabal-local-repo" $ info (helper <*> parseSymlinkCabalLocalRepo) $
             progDesc "Create a directory in cabal-local-repo layout with symlinks to the specified repository."
+#endif
         , command "sign" $ info (helper <*> parseSign) $
             progDesc "Sign a file"
         ])
diff --git a/src/Hackage/Security/RepoTool/Util/IO.hs b/src/Hackage/Security/RepoTool/Util/IO.hs
--- a/src/Hackage/Security/RepoTool/Util/IO.hs
+++ b/src/Hackage/Security/RepoTool/Util/IO.hs
@@ -4,40 +4,59 @@
     -- * Miscellaneous
     compress
   , getFileModTime
+#ifndef mingw32_HOST_OS
   , createSymbolicLink
+#endif
     -- * Tar archives
   , TarGzError
   , tarExtractFile
   ) where
 
-import Control.Exception
-import Data.Typeable
-import System.IO.Error
-import qualified Codec.Archive.Tar       as Tar
-import qualified Codec.Archive.Tar.Entry as Tar
-import qualified Codec.Compression.GZip  as GZip
-import qualified Data.ByteString.Lazy    as BS.L
-
--- Unlike the hackage-security library properly,
--- this currently works on unix systems only
-import System.Posix.Types (EpochTime)
-import qualified System.Posix.Files as Posix
+import qualified Codec.Archive.Tar                 as Tar
+import qualified Codec.Archive.Tar.Entry           as Tar
+import qualified Codec.Compression.GZip            as GZip
+import           Control.Exception
+import qualified Data.ByteString.Lazy              as BS.L
+import           Data.Typeable
+import qualified System.Directory                  as Directory
+import           System.IO.Error
 
 -- hackage-security
-import Hackage.Security.Util.Path
+import           Hackage.Security.Util.Path
 
 -- hackage-repo-tool
-import Hackage.Security.RepoTool.Options
-import Hackage.Security.RepoTool.Layout
-import Hackage.Security.RepoTool.Paths
+import           Hackage.Security.RepoTool.Layout
+import           Hackage.Security.RepoTool.Options
+import           Hackage.Security.RepoTool.Paths
 
+import           System.Posix.Types                (EpochTime)
+#ifndef mingw32_HOST_OS
+import qualified System.Posix.Files                as Posix
+#endif
+
+#if MIN_VERSION_directory(1,2,0)
+import           Data.Time.Clock.POSIX             (utcTimeToPOSIXSeconds)
+#else
+import           System.Time                       (ClockTime (TOD))
+#endif
+
 -- | Get the modification time of the specified file
 --
 -- Returns 0 if the file does not exist .
 getFileModTime :: GlobalOpts -> RepoLoc -> TargetPath' -> IO EpochTime
 getFileModTime opts repoLoc targetPath =
     handle handler $
-      Posix.modificationTime <$> Posix.getFileStatus (toFilePath fp)
+      -- Underlying implementation of 'Directory.getModificationTime' converts
+      -- from POSIX seconds, so there shouldn't be loss of precision.
+      -- NB: Apparently, this has low clock resolution on GHC < 7.8.
+      -- I don't think we care.
+#if MIN_VERSION_directory(1,2,0)
+      fromInteger . floor . utcTimeToPOSIXSeconds
+        <$> Directory.getModificationTime (toFilePath fp)
+#else
+      Directory.getModificationTime (toFilePath fp) >>= \(TOD s _) ->
+        return (fromInteger s)
+#endif
   where
     fp :: Path Absolute
     fp = anchorTargetPath' opts repoLoc targetPath
@@ -51,6 +70,7 @@
     withFile dst WriteMode $ \h ->
       BS.L.hPut h =<< GZip.compress <$> readLazyByteString src
 
+#ifndef mingw32_HOST_OS
 -- | Create a symbolic link (unix only)
 --
 -- Create the directory for the target if it does not exist.
@@ -66,6 +86,7 @@
     linkTarget' <- toAbsoluteFilePath linkTarget
     linkLoc'    <- toAbsoluteFilePath linkLoc
     Posix.createSymbolicLink linkTarget' linkLoc'
+#endif
 
 {-------------------------------------------------------------------------------
   Working with tar archives
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -9,10 +9,13 @@
 import GHC.Conc.Sync (setUncaughtExceptionHandler)
 import Network.URI (URI)
 import System.Exit
-import System.IO.Error (isAlreadyExistsError)
 import qualified Data.ByteString.Lazy as BS.L
 import qualified System.FilePath      as FilePath
 
+#ifndef mingw32_HOST_OS
+import System.IO.Error (isAlreadyExistsError)
+#endif
+
 -- Cabal
 import Distribution.Package
 import Distribution.Text
@@ -54,8 +57,10 @@
         createRoot opts keysLoc rootLoc
       CreateMirrors keysLoc mirrorsLoc mirrors ->
         createMirrors opts keysLoc mirrorsLoc mirrors
+#ifndef mingw32_HOST_OS
       SymlinkCabalLocalRepo repoLoc cabalRepoLoc ->
         symlinkCabalLocalRepo opts repoLoc cabalRepoLoc
+#endif
       Sign keys deleteExisting file ->
         signFile keys deleteExisting file
 
@@ -597,6 +602,7 @@
         expectedTarGz :: TargetPath'
         expectedTarGz = InRepPkg repoLayoutPkgTarGz pkgId
 
+#ifndef mingw32_HOST_OS
 {-------------------------------------------------------------------------------
   Creating Cabal-local-repo
 -------------------------------------------------------------------------------}
@@ -621,6 +627,7 @@
         target = anchorRepoPath opts  repoLoc      file
         loc    = anchorRepoPath opts' cabalRepoLoc file
         opts'  = opts { globalRepoLayout = cabalLocalRepoLayout }
+#endif
 
 {-------------------------------------------------------------------------------
   Signing individual files
