diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
index 3f90d7b..346a39a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
@@ -26,7 +26,7 @@
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class ComplexTypeFinderStrategy implements ModelElementFinder.FinderStrategy {
+class ComplexTypeFinderStrategy implements ModelElementFinder.FinderStrategy<Class<? extends ComplexType>> {
   @Inject private PackageIntersectionDescriptions packageIntersectionDescriptions;
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private LocalNamesProvider localNamesProvider;
@@ -34,8 +34,8 @@
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
 
   @Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
-      Object criteria) {
-    if (!isInstance(target, criteria)) {
+      Class<? extends ComplexType> typeOfComplexType) {
+    if (!typeOfComplexType.isInstance(target)) {
       return emptySet();
     }
     Set<IEObjectDescription> descriptions = newHashSet();
@@ -45,20 +45,23 @@
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria) {
+  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport,
+      Class<? extends ComplexType> typeOfComplexType) {
     Set<IEObjectDescription> descriptions = newHashSet();
     ProtoDescriptor descriptor = descriptorProvider.descriptor(anImport.getImportURI());
-    for (ComplexType type : descriptor.allTypes()) {
-      if (!isInstance(type, criteria)) {
+    for (ComplexType complexType : descriptor.allTypes()) {
+      if (!typeOfComplexType.isInstance(complexType)) {
         continue;
       }
-      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(type, namingStrategy));
+      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(complexType, namingStrategy));
     }
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> local(Object target, Object criteria, int level) {
-    if (!isInstance(target, criteria)) {
+  @Override
+  public Collection<IEObjectDescription> local(Object target, Class<? extends ComplexType> typeOfComplexType,
+      int level) {
+    if (!typeOfComplexType.isInstance(target)) {
       return emptySet();
     }
     EObject e = (EObject) target;
@@ -71,16 +74,4 @@
     descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(e, namingStrategy));
     return descriptions;
   }
-
-  private boolean isInstance(Object target, Object criteria) {
-    Class<?> targetType = targetTypeFrom(criteria);
-    return targetType.isInstance(target);
-  }
-
-  private Class<?> targetTypeFrom(Object criteria) {
-    if (criteria instanceof Class<?>) {
-      return (Class<?>) criteria;
-    }
-    throw new IllegalArgumentException("Search criteria should be Class<?>");
-  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
index 7af5fd1..8a14590 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
@@ -26,15 +26,14 @@
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class CustomOptionFinderStrategy implements ModelElementFinder.FinderStrategy {
+class CustomOptionFinderStrategy implements ModelElementFinder.FinderStrategy<OptionType> {
   @Inject private LocalNamesProvider localNamesProvider;
   @Inject private OptionNamingStrategy namingStrategy;
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
   @Inject private TypeExtensions typeExtensions;
 
   @Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
-      Object criteria) {
-    OptionType optionType = optionTypeFrom(criteria);
+      OptionType optionType) {
     if (!isExtendingOptionMessage(target, optionType)) {
       return emptySet();
     }
@@ -46,12 +45,11 @@
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria) {
+  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, OptionType criteria) {
     return emptySet();
   }
 
-  @Override public Collection<IEObjectDescription> local(Object target, Object criteria, int level) {
-    OptionType optionType = optionTypeFrom(criteria);
+  @Override public Collection<IEObjectDescription> local(Object target, OptionType optionType, int level) {
     if (!isExtendingOptionMessage(target, optionType)) {
       return emptySet();
     }
@@ -68,13 +66,6 @@
     return descriptions;
   }
 
-  private OptionType optionTypeFrom(Object criteria) {
-    if (!(criteria instanceof OptionType)) {
-      throw new IllegalArgumentException("Search criteria should be OptionType");
-    }
-    return (OptionType) criteria;
-  }
-
   private boolean isExtendingOptionMessage(Object o, OptionType optionType) {
     if (!(o instanceof TypeExtension)) {
       return false;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
index 6428fbb..7d69160 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
@@ -36,7 +36,7 @@
   @Inject private Resources resources;
   @Inject private ResourceSets resourceSets;
 
-  Collection<IEObjectDescription> find(EObject start, FinderStrategy strategy, Object criteria) {
+  <T> Collection<IEObjectDescription> find(EObject start, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     descriptions.addAll(local(start, strategy, criteria));
     Protobuf root = modelObjects.rootOf(start);
@@ -44,7 +44,7 @@
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> local(EObject start, FinderStrategy<T> strategy, T criteria) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     EObject current = start.eContainer();
     while (current != null) {
@@ -54,14 +54,14 @@
     return descriptions.values();
   }
 
-  Collection<IEObjectDescription> find(Protobuf start, FinderStrategy strategy, Object criteria) {
+  <T> Collection<IEObjectDescription> find(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     descriptions.addAll(local(start, strategy, criteria, 0));
     descriptions.addAll(imported(start, strategy, criteria));
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria, int level) {
+  private <T> Collection<IEObjectDescription> local(EObject start, FinderStrategy<T> strategy, T criteria, int level) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     for (EObject element : start.eContents()) {
       descriptions.addAll(strategy.local(element, criteria, level));
@@ -72,7 +72,7 @@
     return descriptions.values();
   }
 
-  private Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     List<Import> allImports = protobufs.importsIn(start);
     if (allImports.isEmpty()) {
       return emptyList();
@@ -81,8 +81,8 @@
     return imported(allImports, modelObjects.packageOf(start), resourceSet, strategy, criteria);
   }
 
-  private Collection<IEObjectDescription> imported(List<Import> allImports, Package fromImporter,
-      ResourceSet resourceSet, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(List<Import> allImports, Package fromImporter,
+      ResourceSet resourceSet, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     for (Import anImport : allImports) {
       if (imports.isImportingDescriptor(anImport)) {
@@ -114,7 +114,7 @@
     return descriptions;
   }
 
-  private Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     if (!protobufs.isProto2(start)) {
       return emptySet();
     }
@@ -131,8 +131,8 @@
     return packages.areRelated(aPackage, p);
   }
 
-  private Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Resource resource,
-      FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Resource resource,
+      FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     TreeIterator<Object> contents = getAllContents(resource, true);
     while (contents.hasNext()) {
@@ -142,11 +142,11 @@
     return descriptions;
   }
 
-  static interface FinderStrategy {
-    Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target, Object criteria);
+  static interface FinderStrategy<T> {
+    Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target, T criteria);
 
-    Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria);
+    Collection<IEObjectDescription> inDescriptor(Import anImport, T criteria);
 
-    Collection<IEObjectDescription> local(Object target, Object criteria, int level);
+    Collection<IEObjectDescription> local(Object target, T criteria, int level);
   }
 }
