Role can be inferred from the Metadata trait
diff --git a/src/client.rs b/src/client.rs
index b9933c0..cbe1548 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -137,7 +137,6 @@
 
         let root = local
             .fetch_metadata(
-                &Role::Root,
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::Number(1),
                 &config.max_root_size,
@@ -146,7 +145,6 @@
             )
             .or_else(|_| {
                 local.fetch_metadata(
-                    &Role::Root,
                     &MetadataPath::from_role(&Role::Root),
                     &MetadataVersion::Number(1),
                     &config.max_root_size,
@@ -184,7 +182,6 @@
 
         let root = local
             .fetch_metadata(
-                &Role::Root,
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::Number(1),
                 &config.max_root_size,
@@ -193,7 +190,6 @@
             )
             .or_else(|_| {
                 remote.fetch_metadata(
-                    &Role::Root,
                     &MetadataPath::from_role(&Role::Root),
                     &MetadataVersion::Number(1),
                     &config.max_root_size,
@@ -270,7 +266,6 @@
         U: PathTranslator,
     {
         let latest_root = repo.fetch_metadata(
-            &Role::Root,
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::None,
             &config.max_root_size,
@@ -295,7 +290,6 @@
 
         for i in (tuf.root().version() + 1)..latest_version {
             let signed = repo.fetch_metadata(
-                &Role::Root,
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::Number(i),
                 &config.max_root_size,
@@ -322,7 +316,6 @@
         U: PathTranslator,
     {
         let ts = repo.fetch_metadata(
-            &Role::Timestamp,
             &MetadataPath::from_role(&Role::Timestamp),
             &MetadataVersion::None,
             &config.max_timestamp_size,
@@ -357,7 +350,6 @@
         };
 
         let snap = repo.fetch_metadata(
-            &Role::Snapshot,
             &MetadataPath::from_role(&Role::Snapshot),
             &version,
             &Some(snapshot_description.size()),
@@ -401,7 +393,6 @@
         };
 
         let targets = repo.fetch_metadata(
-            &Role::Targets,
             &MetadataPath::from_role(&Role::Targets),
             &version,
             &Some(targets_description.size()),
@@ -516,7 +507,6 @@
 
                 let signed_meta = match local
                     .fetch_metadata::<TargetsMetadata>(
-                        &Role::Targets,
                         delegation.role(),
                         &MetadataVersion::None,
                         &Some(role_meta.size()),
@@ -525,7 +515,6 @@
                     )
                     .or_else(|_| {
                         remote.fetch_metadata::<TargetsMetadata>(
-                            &Role::Targets,
                             delegation.role(),
                             &version,
                             &Some(role_meta.size()),
@@ -547,7 +536,6 @@
                 match tuf.update_delegation(delegation.role(), &signed_meta) {
                     Ok(_) => {
                         match local.store_metadata(
-                            &Role::Targets,
                             delegation.role(),
                             &MetadataVersion::None,
                             &signed_meta,
@@ -816,7 +804,6 @@
             .unwrap();
 
         repo.store_metadata(
-            &Role::Root,
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::Number(1),
             &root,
@@ -838,7 +825,6 @@
         root.add_signature(&KEYS[0]).unwrap();
 
         repo.store_metadata(
-            &Role::Root,
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::Number(2),
             &root,
@@ -860,13 +846,11 @@
         root.add_signature(&KEYS[1]).unwrap();
 
         repo.store_metadata(
-            &Role::Root,
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::Number(3),
             &root,
         ).unwrap();
         repo.store_metadata(
-            &Role::Root,
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::None,
             &root,
diff --git a/src/repository.rs b/src/repository.rs
index e0d36a8..313069f 100644
--- a/src/repository.rs
+++ b/src/repository.rs
@@ -15,7 +15,7 @@
 use crypto::{self, HashAlgorithm, HashValue};
 use error::Error;
 use interchange::DataInterchange;
-use metadata::{SignedMetadata, MetadataVersion, Role, Metadata, TargetPath, TargetDescription,
+use metadata::{SignedMetadata, MetadataVersion, Metadata, TargetPath, TargetDescription,
                MetadataPath};
 use util::SafeReader;
 
@@ -37,7 +37,6 @@
     /// hashes of the metadata to match.
     fn store_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         metadata: &SignedMetadata<D, M>,
@@ -48,7 +47,6 @@
     /// Fetch signed metadata.
     fn fetch_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         max_size: &Option<usize>,
@@ -72,21 +70,13 @@
     ) -> Result<SafeReader<Self::TargetRead>>;
 
     /// Perform a sanity check that `M`, `Role`, and `MetadataPath` all desrcribe the same entity.
-    fn check<M>(role: &Role, meta_path: &MetadataPath) -> Result<()>
+    fn check<M>(meta_path: &MetadataPath) -> Result<()>
     where
         M: Metadata,
     {
-        if role != &M::role() {
-            return Err(Error::IllegalArgument(format!(
-                "Attempted to store {} metadata as {}.",
-                M::role(),
-                role
-            )));
-        }
-
-        if !role.fuzzy_matches_path(meta_path) {
+        if !M::role().fuzzy_matches_path(meta_path) {
             return Err(Error::IllegalArgument(
-                format!("Role {} does not match path {:?}", role, meta_path),
+                format!("Role {} does not match path {:?}", M::role(), meta_path),
             ));
         }
 
@@ -134,7 +124,6 @@
 
     fn store_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         metadata: &SignedMetadata<D, M>,
@@ -142,7 +131,7 @@
     where
         M: Metadata,
     {
-        Self::check::<M>(role, meta_path)?;
+        Self::check::<M>(meta_path)?;
         let components = meta_path.components::<D>(version);
 
         let mut path = self.local_path.join("metadata");
@@ -168,7 +157,6 @@
     /// Fetch signed metadata.
     fn fetch_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         max_size: &Option<usize>,
@@ -178,7 +166,7 @@
     where
         M: Metadata,
     {
-        Self::check::<M>(role, meta_path)?;
+        Self::check::<M>(meta_path)?;
 
         let mut path = self.local_path.join("metadata");
         path.extend(meta_path.components::<D>(&version));
@@ -338,7 +326,6 @@
     /// This always returns `Err` as storing over HTTP is not yet supported.
     fn store_metadata<M>(
         &mut self,
-        _: &Role,
         _: &MetadataPath,
         _: &MetadataVersion,
         _: &SignedMetadata<D, M>,
@@ -353,7 +340,6 @@
 
     fn fetch_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         max_size: &Option<usize>,
@@ -363,7 +349,7 @@
     where
         M: Metadata,
     {
-        Self::check::<M>(role, meta_path)?;
+        Self::check::<M>(meta_path)?;
 
         let resp = self.get(
             &self.metadata_prefix,
@@ -452,7 +438,6 @@
 
     fn store_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         metadata: &SignedMetadata<D, M>,
@@ -460,7 +445,7 @@
     where
         M: Metadata,
     {
-        Self::check::<M>(role, meta_path)?;
+        Self::check::<M>(meta_path)?;
         let mut buf = Vec::new();
         D::to_writer(&mut buf, metadata)?;
         let _ = self.metadata.insert(
@@ -472,7 +457,6 @@
 
     fn fetch_metadata<M>(
         &mut self,
-        role: &Role,
         meta_path: &MetadataPath,
         version: &MetadataVersion,
         max_size: &Option<usize>,
@@ -482,7 +466,7 @@
     where
         M: Metadata,
     {
-        Self::check::<M>(role, meta_path)?;
+        Self::check::<M>(meta_path)?;
 
         match self.metadata.get(&(meta_path.clone(), version.clone())) {
             Some(bytes) => {
diff --git a/tests/simple_example.rs b/tests/simple_example.rs
index fe7a89c..fc06d14 100644
--- a/tests/simple_example.rs
+++ b/tests/simple_example.rs
@@ -9,7 +9,7 @@
 use tuf::client::{Client, Config, PathTranslator};
 use tuf::crypto::{PrivateKey, SignatureScheme, KeyId, HashAlgorithm};
 use tuf::interchange::{DataInterchange, Json};
-use tuf::metadata::{RoleDefinition, RootMetadata, Role, MetadataVersion, MetadataPath,
+use tuf::metadata::{RoleDefinition, RootMetadata, MetadataVersion, MetadataPath,
                     SignedMetadata, TargetDescription, VirtualTargetPath, TargetsMetadata,
                     MetadataDescription, SnapshotMetadata, TimestampMetadata, TargetPath};
 use tuf::repository::{EphemeralRepository, Repository};
@@ -108,13 +108,11 @@
     let signed = SignedMetadata::<Json, RootMetadata>::new(&root, &root_key)?;
 
     remote.store_metadata(
-        &Role::Root,
         &MetadataPath::new("root".into())?,
         &MetadataVersion::Number(1),
         &signed,
     )?;
     remote.store_metadata(
-        &Role::Root,
         &MetadataPath::new("root".into())?,
         &MetadataVersion::None,
         &signed,
@@ -134,13 +132,11 @@
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&targets, &targets_key)?;
 
     remote.store_metadata(
-        &Role::Targets,
         &MetadataPath::new("targets".into())?,
         &MetadataVersion::Number(1),
         &signed,
     )?;
     remote.store_metadata(
-        &Role::Targets,
         &MetadataPath::new("targets".into())?,
         &MetadataVersion::None,
         &signed,
@@ -159,13 +155,11 @@
     let signed = SignedMetadata::<Json, SnapshotMetadata>::new(&snapshot, &snapshot_key)?;
 
     remote.store_metadata(
-        &Role::Snapshot,
         &MetadataPath::new("snapshot".into())?,
         &MetadataVersion::Number(1),
         &signed,
     )?;
     remote.store_metadata(
-        &Role::Snapshot,
         &MetadataPath::new("snapshot".into())?,
         &MetadataVersion::None,
         &signed,
@@ -180,13 +174,11 @@
     let signed = SignedMetadata::<Json, TimestampMetadata>::new(&timestamp, &timestamp_key)?;
 
     remote.store_metadata(
-        &Role::Timestamp,
         &MetadataPath::new("timestamp".into())?,
         &MetadataVersion::Number(1),
         &signed,
     )?;
     remote.store_metadata(
-        &Role::Timestamp,
         &MetadataPath::new("timestamp".into())?,
         &MetadataVersion::None,
         &signed,