diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Extra
 
+1.4.3
+    Add Data.Version.Extra
 1.4.2
     Make concatMapM/mapMaybeM faster
 1.4.1
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Neil Mitchell 2014-2015.
+Copyright Neil Mitchell 2014-2016.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Extra [![Hackage version](https://img.shields.io/hackage/v/extra.svg?style=flat)](https://hackage.haskell.org/package/extra) [![Build Status](https://img.shields.io/travis/ndmitchell/extra.svg?style=flat)](https://travis-ci.org/ndmitchell/extra)
+# Extra [![Hackage version](https://img.shields.io/hackage/v/extra.svg?label=Hackage)](https://hackage.haskell.org/package/extra) [![Stackage version](https://www.stackage.org/package/extra/badge/lts?label=Stackage)](https://www.stackage.org/package/extra) [![Linux Build Status](https://img.shields.io/travis/ndmitchell/extra.svg?label=Linux%20build)](https://travis-ci.org/ndmitchell/extra) [![Windows Build Status](https://img.shields.io/appveyor/ci/ndmitchell/extra.svg?label=Windows%20build)](https://ci.appveyor.com/project/ndmitchell/extra)
 
 A library of extra functions for the standard Haskell libraries. Most functions are simple additions, filling out missing functionality. A few functions are available in later versions of GHC, but this package makes them available back to GHC 7.2. A few examples:
 
diff --git a/extra.cabal b/extra.cabal
--- a/extra.cabal
+++ b/extra.cabal
@@ -1,13 +1,13 @@
 cabal-version:      >= 1.10
 build-type:         Simple
 name:               extra
-version:            1.4.2
+version:            1.4.3
 license:            BSD3
 license-file:       LICENSE
 category:           Development
 author:             Neil Mitchell <ndmitchell@gmail.com>
 maintainer:         Neil Mitchell <ndmitchell@gmail.com>
-copyright:          Neil Mitchell 2014-2015
+copyright:          Neil Mitchell 2014-2016
 synopsis:           Extra functions I use.
 description:
     A library of extra functions for the standard Haskell libraries. Most functions are simple additions, filling out missing functionality. A few functions are available in later versions of GHC, but this package makes them available back to GHC 7.2.
@@ -48,6 +48,7 @@
         Data.IORef.Extra
         Data.List.Extra
         Data.Tuple.Extra
+        Data.Version.Extra
         Numeric.Extra
         System.Directory.Extra
         System.Environment.Extra
diff --git a/src/Data/Version/Extra.hs b/src/Data/Version/Extra.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Version/Extra.hs
@@ -0,0 +1,35 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- | This module extends "Data.Version" with extra utilities.
+--   The package also exports the existing "Data.Version" functions.
+module Data.Version.Extra(
+    module Data.Version,
+    makeVersion, readVersion
+    ) where
+
+import Data.Version
+import Data.List.Extra
+import Text.ParserCombinators.ReadP
+
+
+#if __GLASGOW_HASKELL__ < 710
+
+-- | Construct tag-less 'Version'
+--
+-- > showVersion (makeVersion [1,2,3]) == "1.2.3"
+makeVersion :: [Int] -> Version
+makeVersion b = Version b []
+
+#endif
+
+-- | Read a 'Version' or throw an exception.
+--
+-- > \x -> readVersion (showVersion x) == x
+-- > readVersion "hello" == undefined
+readVersion :: String -> Version
+readVersion s =
+    case [ x | (x,"") <- readP_to_S parseVersion $ trimEnd s] of
+        [x] -> x
+        []  -> error "Data.Version.Extra.readVersion: no parse"
+        _   -> error "Data.Version.Extra.readVersion: ambiguous parse"
diff --git a/src/Extra.hs b/src/Extra.hs
--- a/src/Extra.hs
+++ b/src/Extra.hs
@@ -24,6 +24,9 @@
     -- * Data.Tuple.Extra
     -- | Extra functions available in @"Data.Tuple.Extra"@.
     first, second, (***), (&&&), dupe, both, fst3, snd3, thd3,
+    -- * Data.Version.Extra
+    -- | Extra functions available in @"Data.Version.Extra"@.
+    makeVersion, readVersion,
     -- * Numeric.Extra
     -- | Extra functions available in @"Numeric.Extra"@.
     showDP, intToDouble, intToFloat, floatToDouble, doubleToFloat,
@@ -54,6 +57,7 @@
 import Data.IORef.Extra
 import Data.List.Extra
 import Data.Tuple.Extra
+import Data.Version.Extra
 import Numeric.Extra
 import System.Directory.Extra
 import System.Environment.Extra
diff --git a/src/System/Directory/Extra.hs b/src/System/Directory/Extra.hs
--- a/src/System/Directory/Extra.hs
+++ b/src/System/Directory/Extra.hs
@@ -24,7 +24,9 @@
 import Control.Monad.Extra
 import System.FilePath
 import Data.List
+#if !MIN_VERSION_directory(1,2,3)
 import Control.Exception
+#endif
 
 #ifndef mingw32_HOST_OS
 import qualified System.Posix
diff --git a/test/TestGen.hs b/test/TestGen.hs
--- a/test/TestGen.hs
+++ b/test/TestGen.hs
@@ -183,6 +183,9 @@
     testGen "(succ &&& pred) 1 == (2,0)" $ (succ &&& pred) 1 == (2,0)
     testGen "dupe 12 == (12, 12)" $ dupe 12 == (12, 12)
     testGen "both succ (1,2) == (2,3)" $ both succ (1,2) == (2,3)
+    testGen "showVersion (makeVersion [1,2,3]) == \"1.2.3\"" $ showVersion (makeVersion [1,2,3]) == "1.2.3"
+    testGen "\\x -> readVersion (showVersion x) == x" $ \x -> readVersion (showVersion x) == x
+    testGen "readVersion \"hello\" == undefined" $ erroneous $ readVersion "hello"
     testGen "showDP 4 pi == \"3.1416\"" $ showDP 4 pi == "3.1416"
     testGen "showDP 0 pi == \"3\"" $ showDP 0 pi == "3"
     testGen "showDP 2 3  == \"3.00\"" $ showDP 2 3  == "3.00"
diff --git a/test/TestUtil.hs b/test/TestUtil.hs
--- a/test/TestUtil.hs
+++ b/test/TestUtil.hs
@@ -7,6 +7,7 @@
 import Control.Exception.Extra
 import Data.Either.Extra
 import System.IO.Extra
+import Data.Version.Extra
 import Data.IORef
 import System.IO.Unsafe
 import Data.Time.Clock
@@ -20,6 +21,7 @@
 import Data.List as X
 import Data.Char as X
 import Data.Tuple as X
+import Data.Version as X
 import System.Directory as X
 import System.FilePath as X
 import System.Info as X
@@ -97,3 +99,6 @@
 
 instance Arbitrary DiffTime where
     arbitrary = fmap realToFrac $ choose (0 :: Double, 86401)
+
+instance Arbitrary Version where
+    arbitrary = makeVersion . map abs <$> listOf1 arbitrary
