diff --git a/shake-ats.cabal b/shake-ats.cabal
--- a/shake-ats.cabal
+++ b/shake-ats.cabal
@@ -1,5 +1,5 @@
 name:                shake-ats
-version:             0.3.0.4
+version:             0.3.0.5
 synopsis:            Utilities for building ATS projects with shake
 description:         Various helper functions for building [ATS](http://www.ats-lang.org/) with the [shake](http://shakebuild.com/) library
 homepage:            https://github.com/vmchale/shake-ats#readme
@@ -29,6 +29,7 @@
                      , directory
                      , text
                      , shake
+                     , binary
   default-language:    Haskell2010
   if flag(development)
     ghc-options:       -Werror
diff --git a/src/Development/Shake/ATS.hs b/src/Development/Shake/ATS.hs
--- a/src/Development/Shake/ATS.hs
+++ b/src/Development/Shake/ATS.hs
@@ -1,4 +1,6 @@
 {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
+{-# LANGUAGE DeriveAnyClass       #-}
+{-# LANGUAGE DeriveGeneric        #-}
 {-# LANGUAGE FlexibleInstances    #-}
 {-# LANGUAGE ScopedTypeVariables  #-}
 {-# LANGUAGE TypeSynonymInstances #-}
@@ -18,6 +20,7 @@
 
 import           Control.Monad
 import           Control.Monad.IO.Class
+import           Data.Binary                (Binary (..))
 import           Data.Bool                  (bool)
 import           Data.Either                (fromRight)
 import           Data.List                  (intercalate)
@@ -26,13 +29,14 @@
 import qualified Data.Text.Lazy             as TL
 import           Development.Shake
 import           Development.Shake.FilePath
+import           GHC.Generics               (Generic)
 import           Language.ATS
 import           Language.ATS.Generate
 import           System.Directory           (copyFile, createDirectoryIfMissing)
 import           System.Exit                (ExitCode (ExitSuccess))
 
 newtype Version = Version [Integer]
-    deriving (Eq)
+    deriving (Eq, Generic, Binary)
 
 instance Show Version where
     show (Version is) = intercalate "." (show <$> is)
@@ -40,6 +44,7 @@
 genATS :: FilePath -> FilePath -> Rules ()
 genATS src target =
     target %> \out -> liftIO $ do
+        createDirectoryIfMissing True (takeDirectory out)
         contents <- readFile src
         writeFile out (generateATS contents)
 
@@ -93,7 +98,7 @@
        -> Bool -- ^ Whether to use the garbage collector
        -> [String] -- ^ A list of libraries against which to link
        -> String -- ^ Source file
-       -> [String] -- ^ Haskell dependencies to track
+       -> [String] -- ^ Other dependencies to track
        -> [(String, String)] -- ^ Files to be run through @hs2ats@.
        -> String -- ^ Binary target
        -> Rules ()
@@ -112,6 +117,7 @@
         sources <- transitiveDeps (snd <$> atg) [sourceFile]
         need (sources ++ hs)
         copySources v v' sources
+
         cmd_ ["mkdir", "-p", dropDirectory1 out]
         path <- fromMaybe "" <$> getEnv "PATH"
         let toLibs = fmap ("-l" <>)
