 
 isAn.Number.Infinite = (x) -> isAn.Number(x) and (Number(x) == Infinity or Number(x) == -Infinity)
 
+isAn.Number.Integer = (x) -> isAn.Number.Finite(x) and Math.floor(x) == Number(x)
+
 isAn.Number.Literal.NaN = (x) -> isAn.Number.NaN(x) and literal(x)
 
 isAn.Number.Literal.Finite = (x) -> isAn.Number.Finite(x) and literal(x)
 
 isAn.Number.Literal.Infinite = (x) -> x == Infinity or x == -Infinity
 
-isAn.Number.Integer = (x) -> isAn.Number.Finite(x) and Math.floor(x) == Number(x)
+isAn.Number.Literal.Integer = (x) -> isAn.Number.Finite(x) and Math.floor(x) == x
+
+isAn.Number.Object.NaN = (x) -> isAn.Number.NaN(x) and not literal(x)
+
+isAn.Number.Object.Finite = (x) -> isAn.Number.Finite(x) and not literal(x)
+
+isAn.Number.Object.Infinite = (x) -> isAn.Number.Object(x) and (Number(x) == Infinity or Number(x) == -Infinity)
+
+isAn.Number.Object.Integer = (x) -> isAn.Number.Object.Finite(x) and Math.floor(x) == Number(x)
 
 isAn.String = (x) -> toString(x) == '[object String]'
 
 isAn.String.Literal = (x) -> isAn.String(x) and literal(x)
+
+isAn.String.Object = (x) -> isAn.String(x) and not literal(x)
 
 isAn.Array =
   if Array.isArray?


isAn.Object = (x) -> toString(x) == '[object Object]'

isAn.Object.literal = (x) -> toString(x) == '[object Object]' and x.constructor == ({}).constructor

isAn.Function = (x) -> toString(x) == '[object Function]'


toString = (x) -> ({}).toString.call(x)

literal = (x) -> typeof x != 'object'

isAn = (x, type) ->
  if type?
