diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.6
+
+- `Face` has just a single constructor now; pattern synonmys are available to pattern match against
+  `Triangle` and `Quad`.
+
 ## 0.5.1
 
 - Exported all useful constructors and symbols.
diff --git a/src/Codec/Wavefront.hs b/src/Codec/Wavefront.hs
--- a/src/Codec/Wavefront.hs
+++ b/src/Codec/Wavefront.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE PatternSynonyms #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   : (C) 2015 Dimitri Sabadie
@@ -26,6 +28,8 @@
     -- * Faces
   , Face(..)
   , FaceIndex(..)
+  , pattern Triangle
+  , pattern Quad
     -- * Element
   , Element(..)
     -- * Object
diff --git a/src/Codec/Wavefront/Face.hs b/src/Codec/Wavefront/Face.hs
--- a/src/Codec/Wavefront/Face.hs
+++ b/src/Codec/Wavefront/Face.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE PatternSynonyms #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   : (C) 2015 Dimitri Sabadie
@@ -11,7 +13,6 @@
 
 module Codec.Wavefront.Face where
 
-import Data.List.NonEmpty ( NonEmpty )
 -- |A face index is a triplet of indices. @'FaceIndex' vi vti vni@ is a face that indexes the
 -- locations with @vi@, the texture coordinates with @vti@ and the normals with @vni@. An index set
 -- to 'Nothing' means /no information/. That is, if @vni == 'Nothing'@, then that 'FaceIndex'
@@ -22,10 +23,11 @@
   , faceNorIndex :: !(Maybe Int)
   } deriving (Eq,Show)
 
--- |A face gathers several 'FaceIndex' to build up faces, arranged in either 'Triangle', 'Quad' or
--- an arbritatry 'Polygon'.
-data Face
-  = Triangle FaceIndex FaceIndex FaceIndex
-  | Quad FaceIndex FaceIndex FaceIndex FaceIndex
-  | Polygon (NonEmpty FaceIndex)
-    deriving (Eq,Show)
+-- |A face gathers several 'FaceIndex' to build up faces. It has a least three vertices
+data Face = Face FaceIndex FaceIndex FaceIndex [FaceIndex] deriving (Eq,Show)
+
+pattern Triangle :: FaceIndex -> FaceIndex -> FaceIndex -> Face
+pattern Triangle a b c = Face a b c []
+
+pattern Quad :: FaceIndex -> FaceIndex -> FaceIndex -> FaceIndex -> Face
+pattern Quad a b c d = Face a b c [d]
diff --git a/src/Codec/Wavefront/Token.hs b/src/Codec/Wavefront/Token.hs
--- a/src/Codec/Wavefront/Token.hs
+++ b/src/Codec/Wavefront/Token.hs
@@ -20,7 +20,6 @@
 import Control.Applicative ( Alternative(..) )
 import Data.Attoparsec.Text as AP
 import Data.Char ( isSpace )
-import Data.List.NonEmpty ( NonEmpty(..) )
 import Data.Maybe ( catMaybes )
 import Data.Text ( Text, unpack )
 import qualified Data.Text as T ( empty )
@@ -144,9 +143,7 @@
     skipHSpace
     faceIndices <- parseFaceIndices
     f <- case faceIndices of
-      [a,b,c] -> pure (Triangle a b c)
-      [a,b,c,d] -> pure (Quad a b c d)
-      _:_:_:_:_:_ -> pure (Polygon $ head faceIndices :| tail faceIndices)
+      a:b:c:s -> pure (Face a b c s)
       _ -> fail "face doesn't have at least three points"
     eol
     pure f
diff --git a/wavefront.cabal b/wavefront.cabal
--- a/wavefront.cabal
+++ b/wavefront.cabal
@@ -1,5 +1,5 @@
 name:                wavefront
-version:             0.5.1
+version:             0.6
 synopsis:            Wavefront OBJ loader
 description:         A Wavefront OBJ loader. Currently supports polygonal information. More could
                      be added if needed (like curves and surface) if people contribute. Feel free
@@ -45,7 +45,6 @@
                      , dlist        >= 0.7  && < 0.8
                      , filepath     >= 1.4  && < 1.5
                      , mtl          >= 2.2  && < 2.3
-                     , semigroups   >= 0.18 && < 0.19
                      , text         >= 1.2  && < 1.3
                      , transformers >= 0.4  && < 0.5
                      , vector       >= 0.11 && < 0.12
