Adding Type() method to the values.
diff --git a/bool.go b/bool.go
index 60beb54..010576c 100644
--- a/bool.go
+++ b/bool.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (b *boolValue) Type() string {
+	return "bool"
+}
+
 func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
 
 // BoolVar defines a bool flag with specified name, default value, and usage string.
diff --git a/duration.go b/duration.go
index db8bfd5..66ed7ac 100644
--- a/duration.go
+++ b/duration.go
@@ -16,6 +16,10 @@
 	return err
 }
 
+func (d *durationValue) Type() string {
+	return "duration"
+}
+
 func (d *durationValue) String() string { return (*time.Duration)(d).String() }
 
 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
diff --git a/flag.go b/flag.go
index dfc03d2..47761a0 100644
--- a/flag.go
+++ b/flag.go
@@ -154,6 +154,7 @@
 type Value interface {
 	String() string
 	Set(string) error
+	Type() string
 }
 
 // sortFlags returns the flags as a slice in lexicographical sorted order.
diff --git a/float32.go b/float32.go
index a0041e2..b7ad67d 100644
--- a/float32.go
+++ b/float32.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (f *float32Value) Type() string {
+	return "float32"
+}
+
 func (f *float32Value) String() string { return fmt.Sprintf("%v", *f) }
 
 // Float32Var defines a float32 flag with specified name, default value, and usage string.
diff --git a/float64.go b/float64.go
index 8d79be0..0315512 100644
--- a/float64.go
+++ b/float64.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (f *float64Value) Type() string {
+	return "float64"
+}
+
 func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
 
 // Float64Var defines a float64 flag with specified name, default value, and usage string.
diff --git a/int.go b/int.go
index cb85e14..dca9da6 100644
--- a/int.go
+++ b/int.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *intValue) Type() string {
+	return "int"
+}
+
 func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
 
 // IntVar defines an int flag with specified name, default value, and usage string.
diff --git a/int32.go b/int32.go
index 2e1a317..18eaacd 100644
--- a/int32.go
+++ b/int32.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *int32Value) Type() string {
+	return "int32"
+}
+
 func (i *int32Value) String() string { return fmt.Sprintf("%v", *i) }
 
 // Int32Var defines an int32 flag with specified name, default value, and usage string.
diff --git a/int64.go b/int64.go
index 43aeced..0114aaa 100644
--- a/int64.go
+++ b/int64.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *int64Value) Type() string {
+	return "int64"
+}
+
 func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
 
 // Int64Var defines an int64 flag with specified name, default value, and usage string.
diff --git a/int8.go b/int8.go
index 539c4eb..aab1022 100644
--- a/int8.go
+++ b/int8.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *int8Value) Type() string {
+	return "int8"
+}
+
 func (i *int8Value) String() string { return fmt.Sprintf("%v", *i) }
 
 // Int8Var defines an int8 flag with specified name, default value, and usage string.
diff --git a/ip.go b/ip.go
index 3a411fc..9d53bd3 100644
--- a/ip.go
+++ b/ip.go
@@ -26,6 +26,10 @@
 	return net.IP(*i)
 }
 
+func (i *ipValue) Type() string {
+	return "ip"
+}
+
 // IPVar defines an net.IP flag with specified name, default value, and usage string.
 // The argument p points to an net.IP variable in which to store the value of the flag.
 func (f *FlagSet) IPVar(p *net.IP, name string, value net.IP, usage string) {
diff --git a/ipmask.go b/ipmask.go
index b8a164a..6f85be9 100644
--- a/ipmask.go
+++ b/ipmask.go
@@ -26,6 +26,10 @@
 	return net.IPMask(*i)
 }
 
+func (i *ipMaskValue) Type() string {
+	return "ipMask"
+}
+
 // Parse IPv4 netmask written in IP form (e.g. 255.255.255.0).
 // This function should really belong to the net package.
 func ParseIPv4Mask(s string) net.IPMask {
diff --git a/string.go b/string.go
index 65c0cb7..362fbf8 100644
--- a/string.go
+++ b/string.go
@@ -14,6 +14,9 @@
 	*s = stringValue(val)
 	return nil
 }
+func (s *stringValue) Type() string {
+	return "string"
+}
 
 func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
 
diff --git a/uint.go b/uint.go
index 40b9ebb..c063fe7 100644
--- a/uint.go
+++ b/uint.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *uintValue) Type() string {
+	return "uint"
+}
+
 func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
 
 // UintVar defines a uint flag with specified name, default value, and usage string.
diff --git a/uint16.go b/uint16.go
index 182dc40..ec14ab0 100644
--- a/uint16.go
+++ b/uint16.go
@@ -18,10 +18,15 @@
 	*i = uint16Value(v)
 	return err
 }
+
 func (i *uint16Value) Get() interface{} {
 	return uint16(*i)
 }
 
+func (i *uint16Value) Type() string {
+	return "uint16"
+}
+
 // Uint16Var defines a uint flag with specified name, default value, and usage string.
 // The argument p points to a uint variable in which to store the value of the flag.
 func (f *FlagSet) Uint16Var(p *uint16, name string, value uint16, usage string) {
diff --git a/uint32.go b/uint32.go
index 165c8b2..05bc3bd 100644
--- a/uint32.go
+++ b/uint32.go
@@ -22,6 +22,10 @@
 	return uint32(*i)
 }
 
+func (i *uint32Value) Type() string {
+	return "uint32"
+}
+
 // Uint32Var defines a uint32 flag with specified name, default value, and usage string.
 // The argument p points to a uint32 variable in which to store the value of the flag.
 func (f *FlagSet) Uint32Var(p *uint32, name string, value uint32, usage string) {
diff --git a/uint64.go b/uint64.go
index f41c5a2..99c7e80 100644
--- a/uint64.go
+++ b/uint64.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *uint64Value) Type() string {
+	return "uint64"
+}
+
 func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
 
 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
diff --git a/uint8.go b/uint8.go
index 174f99c..6fef508 100644
--- a/uint8.go
+++ b/uint8.go
@@ -19,6 +19,10 @@
 	return err
 }
 
+func (i *uint8Value) Type() string {
+	return "uint8"
+}
+
 func (i *uint8Value) String() string { return fmt.Sprintf("%v", *i) }
 
 // Uint8Var defines a uint8 flag with specified name, default value, and usage string.