diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for HPhone
 
+## 0.0.1.1  -- 2016-06-23
+
+* Support for phone-numbers matching multiple types.
+
 ## 0.0.1.0  -- 2016-06-22
 
 * First version.
diff --git a/HPhone.cabal b/HPhone.cabal
--- a/HPhone.cabal
+++ b/HPhone.cabal
@@ -6,7 +6,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.0.1.0
+version:             0.0.1.1
 
 -- A short (one-line) description of the package.
 synopsis:            Phone number parser and validator
diff --git a/src/HPhone.hs b/src/HPhone.hs
--- a/src/HPhone.hs
+++ b/src/HPhone.hs
@@ -5,6 +5,7 @@
 import Data.Maybe (isNothing, catMaybes, fromJust)
 import Data.List
 import Text.Regex.PCRE
+import Data.Char (toUpper)
 
 type CountryCodeAbbr = String
 type TerritoryMap    = Map.Map CountryCodeAbbr Territory
@@ -16,10 +17,10 @@
   , numberType  :: String
   } deriving (Eq, Read, Show)
 
-ts:: [Territory]
+ts :: [Territory]
 ts = territories phoneNumberMetadata
 
-territoryMap:: TerritoryMap
+territoryMap :: TerritoryMap
 territoryMap = Map.fromList [(abbreviation t, t) | t <- ts]
 
 {------------------- APIs follow ------------------}
@@ -31,7 +32,7 @@
   | otherwise = True
 
 {-| Phone number must not include country code. Leading zeroes are allowed -}
-lookup:: PhoneNumber -> CountryCodeAbbr -> Maybe Phone
+lookup :: PhoneNumber -> CountryCodeAbbr -> Maybe Phone
 lookup phone abbr = lookupPhone (ltrim phone) abbr territoryMap
   where ltrim = dropWhile (`elem` "0")
 
@@ -40,30 +41,27 @@
 
 lookupPhone :: PhoneNumber -> CountryCodeAbbr -> TerritoryMap -> Maybe Phone
 lookupPhone phoneNumber abbr territoryMap =
-  Map.lookup abbr territoryMap                                              >>= \t ->
-  find (isMatch phoneNumber) (catMaybes $ phoneNumberPatterns t)            >>= \numberPatterns ->
-  return $ constructResponse phoneNumber t $ phoneNumberType numberPatterns
+  Map.lookup abbr territoryMap  >>= \t ->
+  HPhone.find phoneNumber t
 
+find :: PhoneNumber -> Territory -> Maybe Phone
+find p t
+  | null matches  = Nothing
+  | otherwise     = Just $ constructResponse p t phonetype
+  where phonetype = fmap toUpper $ intercalate "_or_" $ fmap phoneNumberType matches
+        matches   = filter (isMatch p) (catMaybes $ phoneNumberPatterns t)
+
+
 isMatch :: PhoneNumber -> PhoneNumberPatterns -> Bool
 isMatch phone (PhoneNumberPatterns _ (Just np) _ _)   = phone =~ ("^(" ++ np ++ ")$")::Bool
 isMatch phone (PhoneNumberPatterns _ _ (Just pp) _)   = phone =~ ("^(" ++ pp ++ ")$")::Bool
 isMatch phone PhoneNumberPatterns {}                  = False
 
-phoneNumberPatterns:: Territory -> [Maybe PhoneNumberPatterns]
+phoneNumberPatterns :: Territory -> [Maybe PhoneNumberPatterns]
 phoneNumberPatterns t =
-  [ mobile t
-  , fixedLine t
-  , pager t
-  , tollFree t
-  , premiumRate t
-  , sharedCost t
-  , personalNumber t
-  , voip t
-  , uan t
-  , voicemail t
-  ]
+  [ mobile, fixedLine, pager, tollFree, premiumRate, sharedCost, personalNumber, voip, uan, voicemail] <*> pure t
 
-constructResponse:: PhoneNumber -> Territory -> String -> Phone
+constructResponse :: PhoneNumber -> Territory -> String -> Phone
 constructResponse number territory phoneType =
   Phone { number      = number
         , code        = countryCode territory
