diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -26,3 +26,5 @@
 
 Version 0.0.3: Updated for Haskell Platform 2014.2.0.0 and GHC 7.8.3. Fixed
    some minor documentation issues.
+
+Version 0.0.4: Updated for Dimensional 1.0.
diff --git a/geodetics.cabal b/geodetics.cabal
--- a/geodetics.cabal
+++ b/geodetics.cabal
@@ -1,5 +1,5 @@
 name:           geodetics
-version:        0.0.3
+version:        0.0.4
 cabal-version:  >= 1.10
 build-type:     Simple
 author:         Paul Johnson <paul@cogito.org.uk>
@@ -21,7 +21,7 @@
 maintainer:     Paul Johnson <paul@cogito.org.uk>
 homepage:       https://github.com/PaulJohnson/geodetics
 category:       Geography
-tested-with:    GHC==7.8.3
+tested-with:    GHC==7.10.2
 
 source-repository head
   type:     git
@@ -30,8 +30,8 @@
 library
   hs-source-dirs:  src
   build-depends:   
-                   base >= 4.6 && < 4.8,
-                   dimensional == 0.13.*,
+                   base >= 4.6 && < 5,
+                   dimensional >= 1.0,
                    array >= 0.4
   ghc-options:     -Wall
   exposed-modules: 
@@ -50,10 +50,10 @@
   type:            exitcode-stdio-1.0
   main-is:         Main.hs
   x-uses-tf:       true
-  build-depends:   
-                   base >= 4,
-                   HUnit >= 1.2 && < 2,
-                   dimensional == 0.13.*,
+  build-depends:
+                   base >= 4.6 && < 5,
+                   HUnit >= 1.2,
+                   dimensional >= 0.13,
                    QuickCheck >= 2.4,
                    test-framework >= 0.4.1,
                    test-framework-quickcheck2,
diff --git a/src/Geodetics/Ellipsoids.hs b/src/Geodetics/Ellipsoids.hs
--- a/src/Geodetics/Ellipsoids.hs
+++ b/src/Geodetics/Ellipsoids.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleContexts, TypeOperators, TypeFamilies #-}
 
 {- | An Ellipsoid is a reasonable best fit for the surface of the 
 Earth over some defined area. WGS84 is the standard used for the whole
@@ -53,8 +53,8 @@
 
 
 -- | Multiply a vector by a scalar.
-scale3 :: (Num a, Mul d d' d'') =>
-   Vec3 (Dimensional DQuantity d a) -> Dimensional DQuantity d' a -> Vec3 (Dimensional DQuantity d'' a)
+scale3 :: (Num a) =>
+   Vec3 (Quantity d a) -> Quantity d' a -> Vec3 (Quantity (d * d') a)
 scale3 (x,y,z) s = (x*s, y*s, z*s)
 
 
@@ -68,16 +68,16 @@
 
 
 -- | Multiply a matrix by a vector in the Dimensional type system.
-transform3 :: (Num a, Mul d d' d'') => 
-   Matrix3 (Dimensional DQuantity d a) -> Vec3 (Dimensional DQuantity d' a) -> Vec3 (Dimensional DQuantity d'' a) 
+transform3 :: (Num a) =>
+   Matrix3 (Quantity d a) -> Vec3 (Quantity d' a) -> Vec3 (Quantity (d*d') a)
 transform3 (tx,ty,tz) v = (t tx v, t ty v, t tz v)
    where
       t (x1,y1,z1) (x2,y2,z2) = x1*x2 + y1*y2 + z1*z2
 
 
 -- | Inverse of a 3x3 matrix.
-invert3 :: (Fractional a, Mul d d d2, Mul d2 d d3, Div  d2 d3 d1') => 
-   Matrix3 (Dimensional DQuantity d a) -> Matrix3 (Dimensional DQuantity d1' a)
+invert3 :: (Fractional a) =>
+   Matrix3 (Quantity d a) -> Matrix3 (Quantity ((d*d)/(d*d*d)) a)
 invert3 ((x1,y1,z1),
          (x2,y2,z2),
          (x3,y3,z3)) =
@@ -94,13 +94,13 @@
 
 
 -- | Dot product of two vectors
-dot3 :: (Num a, Mul d1 d2 d3) => 
-   Vec3 (Dimensional DQuantity d1 a) -> Vec3 (Dimensional DQuantity d2 a) -> Dimensional DQuantity d3 a
+dot3 :: (Num a) =>
+   Vec3 (Quantity d1 a) -> Vec3 (Quantity d2 a) -> Quantity (d1 * d2) a
 dot3 (x1,y1,z1) (x2,y2,z2) = x1*x2 + y1*y2 + z1*z2
 
 -- | Cross product of two vectors
-cross3 :: (Num a, Mul d1 d2 d3) => 
-   Vec3 (Dimensional DQuantity d1 a) -> Vec3 (Dimensional DQuantity d2 a) -> Vec3 (Dimensional DQuantity d3 a)
+cross3 :: (Num a) =>
+   Vec3 (Quantity d1 a) -> Vec3 (Quantity d2 a) -> Vec3 (Quantity (d1 * d2) a)
 cross3 (x1,y1,z1) (x2,y2,z2) = (y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2)
 
 
diff --git a/src/Geodetics/LatLongParser.hs b/src/Geodetics/LatLongParser.hs
--- a/src/Geodetics/LatLongParser.hs
+++ b/src/Geodetics/LatLongParser.hs
@@ -16,7 +16,6 @@
    latLong
 ) where
 
-import Control.Applicative
 import Control.Monad
 import Data.Char
 import Text.ParserCombinators.ReadP as P
diff --git a/src/Geodetics/Path.hs b/src/Geodetics/Path.hs
--- a/src/Geodetics/Path.hs
+++ b/src/Geodetics/Path.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TypeOperators, TypeFamilies, FlexibleContexts #-}
 -- | The implementation assumes IEEE 754 arithmetic.
 
 module Geodetics.Path where
diff --git a/test/ArbitraryInstances.hs b/test/ArbitraryInstances.hs
--- a/test/ArbitraryInstances.hs
+++ b/test/ArbitraryInstances.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleInstances, RankNTypes, KindSignatures, DataKinds #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
 -- | Orphan "Arbitrary" and related instances for testing purposes. 
@@ -15,13 +15,14 @@
 import Geodetics.Stereographic as SG
 import Geodetics.TransverseMercator as TM
 import Numeric.Units.Dimensional.Prelude
-import qualified Prelude as P
+import qualified Prelude ()
 import Test.QuickCheck
 
 
 
 -- | Shrink using a dimension, so that shrunk values are round numbers in that dimension.
-shrinkDimension :: (Fractional a, Arbitrary a) => Unit d a -> Quantity d a -> [Quantity d a]
+shrinkDimension :: forall a (d :: Dimension) (m :: Metricality) .
+                   (Fractional a, Arbitrary a) => Unit m d a -> Quantity d a -> [Quantity d a]
 shrinkDimension u v = (*~ u) <$> shrink (v /~ u)
 
 -- | Wrapper for arbitrary angles.
@@ -114,7 +115,8 @@
 shrink' x = x : shrink x
 
 -- | Shrink a quantity in the given units.
-shrinkQuantity :: (Arbitrary a, Fractional a) => Unit d a -> Quantity d a -> [Quantity d a]
+shrinkQuantity :: forall a (d :: Dimension) (m :: Metricality).
+                  (Arbitrary a, Fractional a) => Unit m d a -> Quantity d a -> [Quantity d a]
 shrinkQuantity u q = map (*~ u) $ shrink' $ q /~ u
 
 shrinkLength :: (Arbitrary a, Fractional a) => Length a -> [Length a]
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -155,7 +155,7 @@
 
 -- Convert a named point into a test
 pointTest :: (Ellipsoid e2) => (String, Geodetic WGS84, Geodetic e2) -> Test
-pointTest (name, wgs84, local) =  testCase name $ HU.assertBool "" $ samePlace wgs84 (toWGS84 local)
+pointTest (testName, wgs84, local) =  testCase testName $ HU.assertBool "" $ samePlace wgs84 (toWGS84 local)
 
 
 -- The negation of the sum of a list of offsets is equal to the sum of the negated items.
@@ -210,22 +210,22 @@
 
 -- | Check that grid reference to grid point works for sample points.
 ukGridTest2 :: GridPointTest
-ukGridTest2 (gridRef, gp, _, name) = testCase name $ HU.assertBool "" 
+ukGridTest2 (gridRef, gp, _, testName) = testCase testName $ HU.assertBool "" 
    $ (fst $ fromJust $ fromUkGridReference gridRef) == gp
 
 -- | Check that grid point to grid reference works for sample points.
 ukGridTest3 :: GridPointTest
-ukGridTest3 (gridRef, gp, _, name) = testCase name $ HU.assertBool "" 
+ukGridTest3 (gridRef, gp, _, testName) = testCase testName $ HU.assertBool "" 
    $ toUkGridReference 5 gp == Just gridRef
 
 -- | Check that grid point to WGS84 works close enough for sample points. 
 ukGridTest4 :: GridPointTest
-ukGridTest4 (_, gp, geo, name) = testCase name $ HU.assertBool ""
+ukGridTest4 (_, gp, geo, testName) = testCase testName $ HU.assertBool ""
    $ closeEnough geo $ toWGS84 $ fromGrid gp
    
 -- | Check that WGS84 to grid point works close enough for sample points.
 ukGridTest5 :: GridPointTest
-ukGridTest5 (_, gp, geo, name) = testCase name $ HU.assertBool ""
+ukGridTest5 (_, gp, geo, testName) = testCase testName $ HU.assertBool ""
    $ offsetDistance (gridOffset gp $ toGrid UkNationalGrid $ toLocal OSGB36 geo) < 1 *~ meter
 
 
@@ -308,7 +308,7 @@
 prop_stereographic p =
    let g = fromGrid p
        r = toGrid (gridBasis p) g
-   in printTestCase ("p = " ++ show p ++ "\ng = " ++ show g ++ "\nr = " ++ show r) $
+   in counterexample ("p = " ++ show p ++ "\ng = " ++ show g ++ "\nr = " ++ show r) $
      closeGrid p r 
 
 
@@ -330,7 +330,7 @@
 prop_pathContinuity :: (Ellipsoid e) =>
    (Geodetic e -> Angle Double -> Angle Double -> Path e) -> ContinuityTest e
 prop_pathContinuity pf pt0 (Bearing b0) (Azimuth a0) (Distance d1) (Distance d2) =
-   printTestCase (show ((pt2, Bearing b2, Azimuth a2), (pt3, Bearing b3, Azimuth a3))) $
+   counterexample (show ((pt2, Bearing b2, Azimuth a2), (pt3, Bearing b3, Azimuth a3))) $
       pathValidAt path0 d1 && pathValidAt path0 d2 && pathValidAt path0 (d1+d2) ==>
       closeEnough pt2 pt3 && sameAngle b2 b3 && sameAngle a2 a3
    where
@@ -345,7 +345,7 @@
 -- where lower accuracy is required.
 prop_pathContinuity1 :: (Ellipsoid e) => (Geodetic e -> Angle Double -> Path e) -> ContinuityTest1 e
 prop_pathContinuity1 pf pt0 (Bearing b0) (Distance2 d1) (Distance2 d2) =
-   printTestCase (show ((pt2, Bearing b2), (pt3, Bearing b3))) $
+   counterexample (show ((pt2, Bearing b2), (pt3, Bearing b3))) $
       pathValidAt path0 d1 && pathValidAt path0 d2 && pathValidAt path0 (d1+d2) ==>
       closeEnough pt2 pt3 && sameAngle b2 b3
    where
@@ -385,7 +385,7 @@
       Just (d1, d2) ->
          let (pt1, _, _) = pathFunc path1 d1
              (pt2, _, _) = pathFunc path2 d2
-         in printTestCase (show (pt1, pt2)) $ label "Intersection" $ samePlace pt1 pt2
+         in counterexample (show (pt1, pt2)) $ label "Intersection" $ samePlace pt1 pt2
       Nothing -> label "No intersection" True
    where
       (path1, path2) = mk2RhumbPaths rp
