diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index 33e25c5..f5a9f46 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -77,8 +77,7 @@
         String typeName = (String) id.components().get(id.components().size() - 1);
         boolean foundInLeaf = typeName.equals(ancestor.getCanonicalName());
         boolean foundInAncestor = id.components().subList(0, id.components().size()).stream()
-                .map(Object::getClass)
-                .filter(x -> x.equals(ancestor))
+                .filter(x -> ancestor.isAssignableFrom(x.getClass()))
                 .findAny()
                 .isPresent();
         return foundInAncestor || foundInLeaf;
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index cc3b30a..6504f6d 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -66,8 +66,7 @@
         checkNotNull(ancestor);
 
         return id.components().stream()
-                .map(Object::getClass)
-                .filter(x -> x.equals(ancestor))
+                .filter(x -> ancestor.isAssignableFrom(x.getClass()))
                 .findAny()
                 .isPresent();
     }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceTest.java
index c5952ae..29f5350 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ContinuousResourceTest.java
@@ -52,6 +52,7 @@
     public void testTypeOf() {
         ContinuousResource continuous = Resources.continuous(D1, P1, Bandwidth.class)
                 .resource(BW1.bps());
+
         assertThat(continuous.isTypeOf(DeviceId.class), is(false));
         assertThat(continuous.isTypeOf(PortNumber.class), is(false));
         assertThat(continuous.isTypeOf(Bandwidth.class), is(true));
@@ -61,6 +62,7 @@
     public void testSubTypeOf() {
         ContinuousResource continuous = Resources.continuous(D1, P1, Bandwidth.class)
                 .resource(BW1.bps());
+
         assertThat(continuous.isSubTypeOf(DeviceId.class), is(true));
         assertThat(continuous.isSubTypeOf(PortNumber.class), is(true));
         assertThat(continuous.isSubTypeOf(Bandwidth.class), is(true));
@@ -68,11 +70,46 @@
     }
 
     @Test
-    public void testValueAs() {
+    public void testSubTypeOfObject() {
+        ContinuousResource continuous = Resources.continuous(D1, P1, Bandwidth.class)
+                .resource(BW1.bps());
+
+        assertThat(continuous.isSubTypeOf(Object.class), is(true));
+    }
+
+    @Test
+    public void testValueAsPrimitiveDouble() {
         ContinuousResource resource = Resources.continuous(D1, P1, Bandwidth.class)
                 .resource(BW1.bps());
 
         Optional<Double> volume = resource.valueAs(double.class);
         assertThat(volume.get(), is(BW1.bps()));
     }
+
+    @Test
+    public void testValueAsDouble() {
+        ContinuousResource resource = Resources.continuous(D1, P1, Bandwidth.class)
+                .resource(BW1.bps());
+
+        Optional<Double> value = resource.valueAs(Double.class);
+        assertThat(value.get(), is(BW1.bps()));
+    }
+
+    @Test
+    public void testValueAsObject() {
+        ContinuousResource resource = Resources.continuous(D1, P1, Bandwidth.class)
+                .resource(BW1.bps());
+
+        Optional<Double> value = resource.valueAs(Double.class);
+        assertThat(value.get(), is(BW1.bps()));
+    }
+
+    @Test
+    public void testValueAsIncompatibleType() {
+        ContinuousResource resource = Resources.continuous(D1, P1, Bandwidth.class)
+                .resource(BW1.bps());
+
+        Optional<VlanId> value = resource.valueAs(VlanId.class);
+        assertThat(value, is(Optional.empty()));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
index 0001c70..612ef1a 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/DiscreteResourceTest.java
@@ -76,6 +76,7 @@
     @Test
     public void testTypeOf() {
         DiscreteResource discrete = Resources.discrete(D1, P1, VLAN1).resource();
+
         assertThat(discrete.isTypeOf(DeviceId.class), is(false));
         assertThat(discrete.isTypeOf(PortNumber.class), is(false));
         assertThat(discrete.isTypeOf(VlanId.class), is(true));
@@ -84,6 +85,7 @@
     @Test
     public void testSubTypeOf() {
         DiscreteResource discrete = Resources.discrete(D1, P1, VLAN1).resource();
+
         assertThat(discrete.isSubTypeOf(DeviceId.class), is(true));
         assertThat(discrete.isSubTypeOf(PortNumber.class), is(true));
         assertThat(discrete.isSubTypeOf(VlanId.class), is(true));
@@ -91,6 +93,13 @@
     }
 
     @Test
+    public void testSubTypeOfObject() {
+        DiscreteResource discrete = Resources.discrete(D1, P1, VLAN1).resource();
+
+        assertThat(discrete.isSubTypeOf(Object.class), is(true));
+    }
+
+    @Test
     public void testValueAs() {
         DiscreteResource resource = Resources.discrete(D1).resource();
 
