diff --git a/Data/Geo/GPX.hs b/Data/Geo/GPX.hs
--- a/Data/Geo/GPX.hs
+++ b/Data/Geo/GPX.hs
@@ -68,7 +68,9 @@
                 module Data.Geo.GPX.Accessor.Number,
                 module Data.Geo.GPX.Accessor.Rtepts,
                 module Data.Geo.GPX.Accessor.Trkpts,
-                module Data.Geo.GPX.Accessor.Trksegs
+                module Data.Geo.GPX.Accessor.Trksegs,
+                module Data.Geo.GPX.Accessor.Latlon,
+                module Control.Arrow
               ) where
 
 import Data.Geo.GPX.DgpsStationType
@@ -140,3 +142,5 @@
 import Data.Geo.GPX.Accessor.Rtepts
 import Data.Geo.GPX.Accessor.Trkpts
 import Data.Geo.GPX.Accessor.Trksegs
+import Data.Geo.GPX.Accessor.Latlon
+import Control.Arrow
diff --git a/Data/Geo/GPX/Accessor/Latlon.hs b/Data/Geo/GPX/Accessor/Latlon.hs
new file mode 100644
--- /dev/null
+++ b/Data/Geo/GPX/Accessor/Latlon.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
+
+module Data.Geo.GPX.Accessor.Latlon where
+
+import Data.Geo.GPX.LatitudeType
+import Data.Geo.GPX.LongitudeType
+import Data.Geo.GPX.Accessor.Value
+
+class Latlon a where
+  latlon :: a -> (Double, Double)
+
+instance (Real a, Real b) => Latlon (a, b) where
+  latlon (a, b) = (realToFrac a, realToFrac b)
diff --git a/Data/Geo/GPX/Gpx.hs b/Data/Geo/GPX/Gpx.hs
--- a/Data/Geo/GPX/Gpx.hs
+++ b/Data/Geo/GPX/Gpx.hs
@@ -1,18 +1,38 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, GeneralizedNewtypeDeriving #-}
 
 -- | Element: @gpx@ <http://www.topografix.com/GPX/1/1/#element_gpx>
 module Data.Geo.GPX.Gpx(
                          Gpx,
-                         gpx
+                         gpx,
+                         readGpxFile
                        ) where
 
 import Text.XML.HXT.Arrow
 import Data.Geo.GPX.GpxType
+import Data.Geo.GPX.PersonType
 import Data.Geo.GPX.Accessor.Value
+import Data.Geo.GPX.Accessor.Version
+import Data.Geo.GPX.Accessor.Creator
+import Data.Geo.GPX.Accessor.Metadata
+import Data.Geo.GPX.Accessor.Wpts
+import Data.Geo.GPX.Accessor.Rtes
+import Data.Geo.GPX.Accessor.Trks
+import Data.Geo.GPX.Accessor.Extensions
+import Data.Geo.GPX.Accessor.Name
+import Data.Geo.GPX.Accessor.Desc
+import Data.Geo.GPX.Accessor.Author
+import Data.Geo.GPX.Accessor.Copyright
+import Data.Geo.GPX.Accessor.Links
+import Data.Geo.GPX.Accessor.Time
+import Data.Geo.GPX.Accessor.Keywords
+import Data.Geo.GPX.Accessor.Bounds
 
 newtype Gpx = Gpx GpxType
-  deriving Eq
+  deriving (Eq, Version, Creator, Metadata, Wpts, Rtes, Trks, Extensions, Name, Desc, Copyright, Links, Time, Keywords, Bounds)
 
+instance Author Gpx (Maybe PersonType) where
+  author = author . value
+
 gpx :: GpxType -- ^ The gpx element contents.
        -> Gpx
 gpx = Gpx
@@ -25,3 +45,7 @@
 
 instance Value Gpx GpxType where
   value (Gpx x) = x
+
+-- | Reads a GPX file into a list of @Gpx@ values removing whitespace.
+readGpxFile :: FilePath -> IO [Gpx]
+readGpxFile = runX . xunpickleDocument (xpickle :: PU Gpx) [(a_remove_whitespace, v_1)]
diff --git a/Data/Geo/GPX/GpxType.hs b/Data/Geo/GPX/GpxType.hs
--- a/Data/Geo/GPX/GpxType.hs
+++ b/Data/Geo/GPX/GpxType.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances  #-}
+
 -- | Complex Type: @gpxType@ <http://www.topografix.com/GPX/1/1/#type_gpxType>
 module Data.Geo.GPX.GpxType(
                              GpxType,
@@ -9,6 +11,7 @@
 import Data.Geo.GPX.RteType
 import Data.Geo.GPX.TrkType
 import Data.Geo.GPX.ExtensionsType
+import Data.Geo.GPX.PersonType
 import Data.Geo.GPX.Accessor.Version
 import Data.Geo.GPX.Accessor.Creator
 import Data.Geo.GPX.Accessor.Metadata
@@ -16,8 +19,17 @@
 import Data.Geo.GPX.Accessor.Rtes
 import Data.Geo.GPX.Accessor.Trks
 import Data.Geo.GPX.Accessor.Extensions
+import Data.Geo.GPX.Accessor.Name
+import Data.Geo.GPX.Accessor.Desc
+import Data.Geo.GPX.Accessor.Author
+import Data.Geo.GPX.Accessor.Copyright
+import Data.Geo.GPX.Accessor.Links
+import Data.Geo.GPX.Accessor.Time
+import Data.Geo.GPX.Accessor.Keywords
+import Data.Geo.GPX.Accessor.Bounds
 import Text.XML.HXT.Arrow
 import Text.XML.HXT.Extras
+import Data.Maybe
 
 data GpxType = GpxType String String (Maybe MetadataType) [WptType] [RteType] [TrkType] (Maybe ExtensionsType)
   deriving (Eq, Show)
@@ -63,3 +75,27 @@
 
 instance Extensions GpxType where
   extensions (GpxType _ _ _ _ _ _ x) = x
+
+instance Name GpxType where
+  name = (name =<<) . metadata
+
+instance Desc GpxType where
+  desc = (desc =<<) . metadata
+
+instance Author GpxType (Maybe PersonType) where
+  author = (author =<<) . metadata
+
+instance Copyright GpxType where
+  copyright = (copyright =<<) . metadata
+
+instance Links GpxType where
+  links = (links =<<) . maybeToList . metadata
+
+instance Time GpxType where
+  time = (time =<<) . metadata
+
+instance Keywords GpxType where
+  keywords = (keywords =<<) . metadata
+
+instance Bounds GpxType where
+  bounds = (bounds =<<) . metadata
diff --git a/Data/Geo/GPX/LatitudeType.hs b/Data/Geo/GPX/LatitudeType.hs
--- a/Data/Geo/GPX/LatitudeType.hs
+++ b/Data/Geo/GPX/LatitudeType.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
 
 -- | Simple Type: @latitudeType@ <http://www.topografix.com/GPX/1/1/#type_latitudeType>
 module Data.Geo.GPX.LatitudeType(
@@ -11,7 +11,7 @@
 import Text.XML.HXT.Arrow
 
 newtype LatitudeType = LatitudeType Double
-  deriving Eq
+  deriving (Eq, Ord, Enum, Num, Fractional, Floating, Real, RealFrac, RealFloat)
 
 latitudeType :: Double -- ^ The value which will be between -90 and 90 (values out of the range are truncated using a modulus operation).
                 -> LatitudeType
diff --git a/Data/Geo/GPX/LongitudeType.hs b/Data/Geo/GPX/LongitudeType.hs
--- a/Data/Geo/GPX/LongitudeType.hs
+++ b/Data/Geo/GPX/LongitudeType.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
 
 -- | Simple Type: @latitudeType@ <http://www.topografix.com/GPX/1/1/#type_latitudeType>
 module Data.Geo.GPX.LongitudeType(
@@ -11,7 +11,7 @@
 import Text.XML.HXT.Arrow
 
 newtype LongitudeType = LongitudeType Double
-  deriving Eq
+  deriving (Eq, Ord, Enum, Num, Fractional, Floating, Real, RealFrac, RealFloat)
 
 longitudeType :: Double -- ^ The value which will be between -180 and 180 (values out of the range are truncated using a modulus operation).
                  -> LongitudeType
diff --git a/Data/Geo/GPX/WptType.hs b/Data/Geo/GPX/WptType.hs
--- a/Data/Geo/GPX/WptType.hs
+++ b/Data/Geo/GPX/WptType.hs
@@ -32,6 +32,8 @@
 import Data.Geo.GPX.Accessor.Ageofdgpsdata
 import Data.Geo.GPX.Accessor.Dgpsid
 import Data.Geo.GPX.Accessor.Extensions
+import Data.Geo.GPX.Accessor.Latlon
+import Data.Geo.GPX.Accessor.Value
 import Text.XML.HXT.Arrow
 import Text.XML.HXT.Extras
 
@@ -169,3 +171,6 @@
 
 instance Extensions WptType where
   extensions (WptType _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x) = x
+
+instance Latlon WptType where
+  latlon e = (value (lat e), value (lon e))
diff --git a/GPX.cabal b/GPX.cabal
--- a/GPX.cabal
+++ b/GPX.cabal
@@ -1,5 +1,5 @@
 Name:                GPX
-Version:             0.1
+Version:             0.2
 License:             BSD3
 License-File:        LICENSE
 Synopsis:            Parse GPX files
@@ -92,3 +92,4 @@
                    Data.Geo.GPX.Accessor.Rtepts
                    Data.Geo.GPX.Accessor.Trkpts
                    Data.Geo.GPX.Accessor.Trksegs
+                   Data.Geo.GPX.Accessor.Latlon
