diff --git a/iri.cabal b/iri.cabal
--- a/iri.cabal
+++ b/iri.cabal
@@ -1,7 +1,7 @@
 name:
   iri
 version:
-  0.3
+  0.3.1
 category:
   URI, URL, IRI, Network
 synopsis:
@@ -66,6 +66,9 @@
     Iri.Data.Instances.Lift
     Iri.Data.Instances.Show
     Iri.Data.Instances.Eq
+    Iri.Data.Instances.Hashable
+    Iri.Data.Instances.Ord
+    Iri.Data.Instances.Generic
     Iri.Prelude
     Iri.Utf8CodePoint
     Iri.Vector
@@ -84,10 +87,12 @@
     attoparsec >=0.13 && <0.14,
     punycode >=2 && <3,
     ip >=1.1 && <2,
+    hashable >=1.2 && <2,
     text ==1.*,
     text-builder >=0.5.1 && <0.6,
     bytestring >=0.10 && <0.11,
     vector >=0.10 && <0.13,
+    vector-instances >=3.4 && <4,
     vector-builder >=0.3.4 && <0.4,
     profunctors >=5.2 && <6,
     contravariant >=1.4 && <2,
diff --git a/library/Iri/Data/Instances/Generic.hs b/library/Iri/Data/Instances/Generic.hs
new file mode 100644
--- /dev/null
+++ b/library/Iri/Data/Instances/Generic.hs
@@ -0,0 +1,40 @@
+module Iri.Data.Instances.Generic
+where
+
+import Iri.Prelude
+import Iri.Data.Types
+
+
+deriving instance Generic Iri
+
+deriving instance Generic Scheme
+
+deriving instance Generic Hierarchy
+
+deriving instance Generic Authority
+
+deriving instance Generic UserInfo
+
+deriving instance Generic User
+
+deriving instance Generic Password
+
+deriving instance Generic Host
+
+deriving instance Generic RegName
+
+deriving instance Generic DomainLabel
+
+deriving instance Generic Port
+
+deriving instance Generic Path
+
+deriving instance Generic PathSegment
+
+deriving instance Generic Query
+
+deriving instance Generic Fragment
+
+deriving instance Generic HttpIri
+
+deriving instance Generic Security
diff --git a/library/Iri/Data/Instances/Hashable.hs b/library/Iri/Data/Instances/Hashable.hs
new file mode 100644
--- /dev/null
+++ b/library/Iri/Data/Instances/Hashable.hs
@@ -0,0 +1,48 @@
+module Iri.Data.Instances.Hashable
+where
+
+import Iri.Prelude
+import Iri.Data.Types
+import Iri.Data.Instances.Generic
+import qualified Net.IPv6 as B
+
+
+instance Hashable Iri
+
+instance Hashable Scheme
+
+instance Hashable Hierarchy
+
+instance Hashable Authority
+
+instance Hashable UserInfo
+
+instance Hashable User
+
+instance Hashable Password
+
+instance Hashable Host where
+  hashWithSalt salt host =
+    hashWithSalt salt $
+    case host of
+      NamedHost regName -> hashWithSalt 0 regName
+      IpV4Host ip -> hashWithSalt 1 ip
+      IpV6Host (B.IPv6 a b) -> hashWithSalt 2 (hashWithSalt (fromIntegral a) b)
+
+instance Hashable RegName
+
+instance Hashable DomainLabel
+
+instance Hashable Port
+
+instance Hashable Path
+
+instance Hashable PathSegment
+
+instance Hashable Query
+
+instance Hashable Fragment
+
+instance Hashable HttpIri
+
+instance Hashable Security
diff --git a/library/Iri/Data/Instances/Ord.hs b/library/Iri/Data/Instances/Ord.hs
new file mode 100644
--- /dev/null
+++ b/library/Iri/Data/Instances/Ord.hs
@@ -0,0 +1,41 @@
+module Iri.Data.Instances.Ord
+where
+
+import Iri.Prelude
+import Iri.Data.Types
+import Iri.Data.Instances.Eq
+
+
+deriving instance Ord Iri
+
+deriving instance Ord Scheme
+
+deriving instance Ord Hierarchy
+
+deriving instance Ord Authority
+
+deriving instance Ord UserInfo
+
+deriving instance Ord User
+
+deriving instance Ord Password
+
+deriving instance Ord Host
+
+deriving instance Ord RegName
+
+deriving instance Ord DomainLabel
+
+deriving instance Ord Port
+
+deriving instance Ord Path
+
+deriving instance Ord PathSegment
+
+deriving instance Ord Query
+
+deriving instance Ord Fragment
+
+deriving instance Ord HttpIri
+
+deriving instance Ord Security
diff --git a/library/Iri/Prelude.hs b/library/Iri/Prelude.hs
--- a/library/Iri/Prelude.hs
+++ b/library/Iri/Prelude.hs
@@ -28,6 +28,14 @@
 -------------------------
 import Data.Semigroup as Exports
 
+-- hashable
+-------------------------
+import Data.Hashable as Exports
+
+-- vector-instances
+-------------------------
+import Data.Vector.Instances ()
+
 -- bytestring
 -------------------------
 import Data.ByteString as Exports (ByteString)
