diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9efa14f..303a19b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
 	</properties>
 	<body>
 	    <release version="1.9-SNAPSHOT" date="in Mercurial" description="Development">
+            <action dev="py4fun" type="add" issue="124">
+                Add Yaml.loadAs() methods. JavaBeanLoader is marked as deprecated (2011-07-03)
+            </action>
             <action dev="py4fun" type="remove" issue="124">
                 Remove TypeDescription.root property to prepare issue 124. This is a minor backwards incompatible change.
                 Now instead of setting as root, the TypeDescription must be passed to the Contructor's constructor
diff --git a/src/main/java/org/yaml/snakeyaml/JavaBeanLoader.java b/src/main/java/org/yaml/snakeyaml/JavaBeanLoader.java
index c5831de..87587fb 100644
--- a/src/main/java/org/yaml/snakeyaml/JavaBeanLoader.java
+++ b/src/main/java/org/yaml/snakeyaml/JavaBeanLoader.java
@@ -31,6 +31,7 @@
  * global tag with the class definition like '!!com.package.MyBean' it is
  * ignored in favour of the runtime class <code>T</code>.
  * 
+ * @deprecated use Yaml.loadAs() methods instead
  * @see http://www.artima.com/weblogs/viewpost.jsp?thread=208860
  */
 public class JavaBeanLoader<T> {
diff --git a/src/main/java/org/yaml/snakeyaml/Yaml.java b/src/main/java/org/yaml/snakeyaml/Yaml.java
index 94db235..51ebfa6 100644
--- a/src/main/java/org/yaml/snakeyaml/Yaml.java
+++ b/src/main/java/org/yaml/snakeyaml/Yaml.java
@@ -263,7 +263,7 @@
      * @return parsed object
      */
     public Object load(String yaml) {
-        return loadFromReader(new StreamReader(yaml));
+        return loadFromReader(new StreamReader(yaml), Object.class);
     }
 
     /**
@@ -275,7 +275,7 @@
      * @return parsed object
      */
     public Object load(InputStream io) {
-        return loadFromReader(new StreamReader(new UnicodeReader(io)));
+        return loadFromReader(new StreamReader(new UnicodeReader(io)), Object.class);
     }
 
     /**
@@ -287,13 +287,64 @@
      * @return parsed object
      */
     public Object load(Reader io) {
-        return loadFromReader(new StreamReader(io));
+        return loadFromReader(new StreamReader(io), Object.class);
     }
 
-    private Object loadFromReader(StreamReader sreader) {
+    /**
+     * Parse the only YAML document in a stream and produce the corresponding
+     * Java object.
+     * 
+     * @param <T>
+     *            Class is defined by the second argument
+     * @param io
+     *            data to load from (BOM must not be present)
+     * @param type
+     *            Class of the object to be created
+     * @return parsed object
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T loadAs(Reader io, Class<T> type) {
+        return (T) loadFromReader(new StreamReader(io), type);
+    }
+
+    /**
+     * Parse the only YAML document in a String and produce the corresponding
+     * Java object. (Because the encoding in known BOM is not respected.)
+     * 
+     * @param <T>
+     *            Class is defined by the second argument
+     * @param yaml
+     *            YAML data to load from (BOM must not be present)
+     * @param type
+     *            Class of the object to be created
+     * @return parsed object
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T loadAs(String yaml, Class<T> type) {
+        return (T) loadFromReader(new StreamReader(yaml), type);
+    }
+
+    /**
+     * Parse the only YAML document in a stream and produce the corresponding
+     * Java object.
+     * 
+     * @param <T>
+     *            Class is defined by the second argument
+     * @param input
+     *            data to load from (BOM is respected and removed)
+     * @param type
+     *            Class of the object to be created
+     * @return parsed object
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T loadAs(InputStream input, Class<T> type) {
+        return (T) loadFromReader(new StreamReader(new UnicodeReader(input)), type);
+    }
+
+    private Object loadFromReader(StreamReader sreader, Class<?> type) {
         Composer composer = new Composer(new ParserImpl(sreader), resolver);
         constructor.setComposer(composer);
-        return constructor.getSingleData();
+        return constructor.getSingleData(type);
     }
 
     /**
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
index 9cbebdf..366339b 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
@@ -116,11 +116,13 @@
      * @throws ComposerException
      *             in case there are more documents in the stream
      */
-    public Object getSingleData() {
+    public Object getSingleData(Class<?> type) {
         // Ensure that the stream contains a single document and construct it
         Node node = composer.getSingleNode();
         if (node != null) {
-            if (rootTag != null) {
+            if (Object.class != type) {
+                node.setTag(new Tag(type));
+            } else if (rootTag != null) {
                 node.setTag(rootTag);
             }
             return constructDocument(node);
diff --git a/src/test/java/examples/collections/ListFileldBeanTest.java b/src/test/java/examples/collections/ListFileldBeanTest.java
index a6880b1..bbb8efd 100644
--- a/src/test/java/examples/collections/ListFileldBeanTest.java
+++ b/src/test/java/examples/collections/ListFileldBeanTest.java
@@ -22,8 +22,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test public field ListBean->List<Developer> developers <br/>
@@ -51,9 +51,8 @@
     public void testLoadList() {
         String output = Util.getLocalResource("examples/list-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<ListFieldBean> beanLoader = new JavaBeanLoader<ListFieldBean>(
-                ListFieldBean.class);
-        ListFieldBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        ListFieldBean parsed = beanLoader.loadAs(output, ListFieldBean.class);
         assertNotNull(parsed);
         List<String> list2 = parsed.getChildren();
         assertEquals(2, list2.size());
diff --git a/src/test/java/examples/collections/TypeSafeListNoGerericsTest.java b/src/test/java/examples/collections/TypeSafeListNoGerericsTest.java
index 28199a3..d258c0a 100644
--- a/src/test/java/examples/collections/TypeSafeListNoGerericsTest.java
+++ b/src/test/java/examples/collections/TypeSafeListNoGerericsTest.java
@@ -23,8 +23,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test ListBean->List developers <br/>
@@ -52,8 +52,8 @@
     public void testLoadList() {
         String output = Util.getLocalResource("examples/list-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<ListBean> beanLoader = new JavaBeanLoader<ListBean>(ListBean.class);
-        ListBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        ListBean parsed = beanLoader.loadAs(output, ListBean.class);
         assertNotNull(parsed);
         List<String> list2 = parsed.getChildren();
         assertEquals(2, list2.size());
diff --git a/src/test/java/examples/collections/TypeSafeListTest.java b/src/test/java/examples/collections/TypeSafeListTest.java
index 94bb28f..4fa83f7 100644
--- a/src/test/java/examples/collections/TypeSafeListTest.java
+++ b/src/test/java/examples/collections/TypeSafeListTest.java
@@ -22,8 +22,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test ListBean->List<Developer> developers <br/>
@@ -50,8 +50,8 @@
     public void testLoadList() {
         String output = Util.getLocalResource("examples/list-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<ListBean1> beanLoader = new JavaBeanLoader<ListBean1>(ListBean1.class);
-        ListBean1 parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        ListBean1 parsed = beanLoader.loadAs(output, ListBean1.class);
         assertNotNull(parsed);
         List<String> list2 = parsed.getChildren();
         assertEquals(2, list2.size());
diff --git a/src/test/java/examples/collections/TypeSafeListWithInterfaceTest.java b/src/test/java/examples/collections/TypeSafeListWithInterfaceTest.java
index 48094a7..bc5ef3e 100644
--- a/src/test/java/examples/collections/TypeSafeListWithInterfaceTest.java
+++ b/src/test/java/examples/collections/TypeSafeListWithInterfaceTest.java
@@ -22,8 +22,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test ListBean->List<Human> developers <br/>
@@ -50,9 +50,9 @@
     public void testLoadWrongList() {
         String output = Util.getLocalResource("examples/list-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<ListBean> beanLoader = new JavaBeanLoader<ListBean>(ListBean.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(output);
+            beanLoader.loadAs(output, ListBean.class);
             fail("Global tags are required since Human is an interface.");
         } catch (Exception e) {
             assertTrue(e.getMessage(), e.getMessage().contains("Cannot create property=developers"));
@@ -62,8 +62,8 @@
     public void testLoadList() {
         String output = Util.getLocalResource("examples/list-bean-2.yaml");
         // System.out.println(output);
-        JavaBeanLoader<ListBean> beanLoader = new JavaBeanLoader<ListBean>(ListBean.class);
-        ListBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        ListBean parsed = beanLoader.loadAs(output, ListBean.class);
         assertNotNull(parsed);
         List<String> list2 = parsed.getChildren();
         assertEquals(2, list2.size());
diff --git a/src/test/java/examples/collections/TypeSafeMap2Test.java b/src/test/java/examples/collections/TypeSafeMap2Test.java
index 5291f83..f3b5c60 100644
--- a/src/test/java/examples/collections/TypeSafeMap2Test.java
+++ b/src/test/java/examples/collections/TypeSafeMap2Test.java
@@ -23,8 +23,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test MapBean->Map<Enum, Developer> developers <br/>
@@ -66,8 +66,8 @@
         String etalon = Util.getLocalResource("examples/map-bean-13.yaml");
         assertEquals(etalon, output);
         // load
-        JavaBeanLoader<MapBean2> beanLoader = new JavaBeanLoader<MapBean2>(MapBean2.class);
-        MapBean2 parsed = beanLoader.load(etalon);
+        Yaml beanLoader = new Yaml();
+        MapBean2 parsed = beanLoader.loadAs(etalon, MapBean2.class);
         assertNotNull(parsed);
         Map<Developer2, Color> parsedData = parsed.getData();
         assertEquals(3, parsedData.size());
@@ -82,8 +82,8 @@
     public void testLoadMap() {
         String output = Util.getLocalResource("examples/map-bean-12.yaml");
         // System.out.println(output);
-        JavaBeanLoader<MapBean2> beanLoader = new JavaBeanLoader<MapBean2>(MapBean2.class);
-        MapBean2 parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        MapBean2 parsed = beanLoader.loadAs(output, MapBean2.class);
         assertNotNull(parsed);
         Map<Developer2, Color> data = parsed.getData();
         assertEquals(2, data.size());
diff --git a/src/test/java/examples/collections/TypeSafeMapImplementationsTest.java b/src/test/java/examples/collections/TypeSafeMapImplementationsTest.java
index 7dc0158..691603b 100644
--- a/src/test/java/examples/collections/TypeSafeMapImplementationsTest.java
+++ b/src/test/java/examples/collections/TypeSafeMapImplementationsTest.java
@@ -26,7 +26,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 
@@ -54,8 +53,8 @@
     public void testLoadMap() {
         String output = Util.getLocalResource("examples/map-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<MapBean> beanLoader = new JavaBeanLoader<MapBean>(MapBean.class);
-        MapBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        MapBean parsed = beanLoader.loadAs(output, MapBean.class);
         assertNotNull(parsed);
         SortedMap<String, String> sortedMap = parsed.getSorted();
         assertEquals(2, sortedMap.size());
diff --git a/src/test/java/examples/collections/TypeSafeMapTest.java b/src/test/java/examples/collections/TypeSafeMapTest.java
index 365ad30..ba9afab 100644
--- a/src/test/java/examples/collections/TypeSafeMapTest.java
+++ b/src/test/java/examples/collections/TypeSafeMapTest.java
@@ -22,8 +22,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test MapBean->Map<String, Developer> developers <br/>
@@ -69,8 +69,8 @@
     public void testLoadMap() {
         String output = Util.getLocalResource("examples/map-bean-10.yaml");
         // System.out.println(output);
-        JavaBeanLoader<MapBean> beanLoader = new JavaBeanLoader<MapBean>(MapBean.class);
-        MapBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        MapBean parsed = beanLoader.loadAs(output, MapBean.class);
         assertNotNull(parsed);
         Map<String, Integer> data = parsed.getData();
         assertEquals(3, data.size());
@@ -166,9 +166,8 @@
     public void testLoadMapWithObject() {
         String output = Util.getLocalResource("examples/map-bean-10.yaml");
         // System.out.println(output);
-        JavaBeanLoader<MapBeanNoGenerics> beanLoader = new JavaBeanLoader<MapBeanNoGenerics>(
-                MapBeanNoGenerics.class);
-        MapBeanNoGenerics parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        MapBeanNoGenerics parsed = beanLoader.loadAs(output, MapBeanNoGenerics.class);
         assertNotNull(parsed);
         Map<String, Integer> data = parsed.getData();
         assertEquals(3, data.size());
diff --git a/src/test/java/examples/collections/TypeSafePriorityTest.java b/src/test/java/examples/collections/TypeSafePriorityTest.java
index f3362cc..20ddcd4 100644
--- a/src/test/java/examples/collections/TypeSafePriorityTest.java
+++ b/src/test/java/examples/collections/TypeSafePriorityTest.java
@@ -20,9 +20,10 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
 
 /**
  * Test ListBean->List<Human> developers <br/>
@@ -39,8 +40,8 @@
         // System.out.println(output);
         TypeDescription descr = new TypeDescription(ListBean.class);
         descr.putListPropertyType("developers", Developer.class);
-        JavaBeanLoader<ListBean> beanLoader = new JavaBeanLoader<ListBean>(descr);
-        ListBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml(new Constructor(descr));
+        ListBean parsed = beanLoader.loadAs(output, ListBean.class);
         assertNotNull(parsed);
         List<Human> developers = parsed.getDevelopers();
         assertEquals(2, developers.size());
diff --git a/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java b/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
index 1a42a68..f10a6d4 100644
--- a/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
+++ b/src/test/java/examples/collections/TypeSafeSetImplementationsTest.java
@@ -25,7 +25,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 
@@ -73,8 +72,8 @@
     public void testLoadSet() {
         String output = Util.getLocalResource("examples/set-bean-1.yaml");
         // System.out.println(output);
-        JavaBeanLoader<SetBean> beanLoader = new JavaBeanLoader<SetBean>(SetBean.class);
-        SetBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        SetBean parsed = beanLoader.loadAs(output, SetBean.class);
         assertNotNull(parsed);
         SortedSet<String> sortedMap = parsed.getSorted();
         assertEquals(3, sortedMap.size());
@@ -93,8 +92,8 @@
     public void testLoadSetReversed() {
         String output = Util.getLocalResource("examples/set-bean-2.yaml");
         // System.out.println(output);
-        JavaBeanLoader<SetBean> beanLoader = new JavaBeanLoader<SetBean>(SetBean.class);
-        SetBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        SetBean parsed = beanLoader.loadAs(output, SetBean.class);
         assertNotNull(parsed);
         SortedSet<String> sortedMap = parsed.getSorted();
         assertEquals(3, sortedMap.size());
diff --git a/src/test/java/examples/staticstate/StaticFieldsWrapperTest.java b/src/test/java/examples/staticstate/StaticFieldsWrapperTest.java
index f3bcc26..ba70e3f 100644
--- a/src/test/java/examples/staticstate/StaticFieldsWrapperTest.java
+++ b/src/test/java/examples/staticstate/StaticFieldsWrapperTest.java
@@ -21,7 +21,6 @@
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.FlowStyle;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -98,8 +97,8 @@
         // System.out.println(output);
         assertEquals("{age: -47, color: Violet, name: Bahrack, type: Type3}\n", output);
         // parse back to instance
-        JavaBeanLoader<Wrapper> loader = new JavaBeanLoader<Wrapper>(Wrapper.class);
-        Wrapper wrapper = loader.load(output);
+        Yaml loader = new Yaml();
+        Wrapper wrapper = loader.loadAs(output, Wrapper.class);
         JavaBeanWithStaticState bean2 = wrapper.createBean();
         assertEquals(-47, bean2.getAge());
         assertEquals("Bahrack", bean2.getName());
diff --git a/src/test/java/org/pyyaml/CanonicalLoader.java b/src/test/java/org/pyyaml/CanonicalLoader.java
index e4c5b45..b96cf80 100644
--- a/src/test/java/org/pyyaml/CanonicalLoader.java
+++ b/src/test/java/org/pyyaml/CanonicalLoader.java
@@ -36,7 +36,7 @@
             }
             Composer composer = new Composer(new CanonicalParser(buffer.toString()), resolver);
             constructor.setComposer(composer);
-            return constructor.getSingleData();
+            return constructor.getSingleData(Object.class);
         } catch (IOException e) {
             throw new YAMLException(e);
         }
diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanLoaderTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanLoaderTest.java
index 7436cd1..bae4bf8 100644
--- a/src/test/java/org/yaml/snakeyaml/JavaBeanLoaderTest.java
+++ b/src/test/java/org/yaml/snakeyaml/JavaBeanLoaderTest.java
@@ -25,6 +25,7 @@
 
 import junit.framework.TestCase;
 
+import org.yaml.snakeyaml.constructor.Constructor;
 import org.yaml.snakeyaml.introspector.BeanAccess;
 
 public class JavaBeanLoaderTest extends TestCase {
@@ -37,13 +38,12 @@
         String output = yaml.dump(bean);
         assertEquals("!!org.yaml.snakeyaml.JavaBeanLoaderTest$Bean {id: 3, name: Test me.}\n",
                 output);
-        JavaBeanLoader<Bean> loader = new JavaBeanLoader<Bean>(Bean.class);
-        Bean parsed = loader.load(output);
+        Yaml loader = new Yaml();
+        Bean parsed = loader.loadAs(output, Bean.class);
         assertEquals(3, parsed.getId());
         assertEquals("Test me.", parsed.getName());
         // Runtime definition is more important
-        JavaBeanLoader<Bean2> loader2 = new JavaBeanLoader<Bean2>(Bean2.class);
-        Bean2 parsed2 = loader2.load(output);
+        Bean2 parsed2 = loader.loadAs(output, Bean2.class);
         assertEquals(3, parsed2.getId());
         assertEquals("Test me.", parsed2.getName());
         assertFalse(parsed2.isValid());
@@ -52,8 +52,8 @@
     public void testLoadInputStream() {
         String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
         InputStream input = new ByteArrayInputStream(yaml.getBytes());
-        JavaBeanLoader<Bean> loader = new JavaBeanLoader<Bean>(Bean.class);
-        Bean parsed = loader.load(input);
+        Yaml loader = new Yaml();
+        Bean parsed = loader.loadAs(input, Bean.class);
         assertEquals(3, parsed.getId());
         assertEquals("Test me.", parsed.getName());
     }
@@ -61,12 +61,13 @@
     public void testLoadReader() {
         String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
         Reader input = new StringReader(yaml);
-        JavaBeanLoader<Bean> loader = new JavaBeanLoader<Bean>(Bean.class);
-        Bean parsed = loader.load(input);
+        Yaml loader = new Yaml();
+        Bean parsed = loader.loadAs(input, Bean.class);
         assertEquals(3, parsed.getId());
         assertEquals("Test me.", parsed.getName());
     }
 
+    @SuppressWarnings("deprecation")
     public void testLoaderNullClass() {
         try {
             new JavaBeanLoader<Bean>((Class<Bean>) null);
@@ -76,6 +77,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     public void testLoaderNullTypeDescription() {
         try {
             new JavaBeanLoader<Bean>((TypeDescription) null);
@@ -85,6 +87,17 @@
         }
     }
 
+    public void testLoaderNullRootClass() {
+        try {
+            Yaml loader = new Yaml();
+            loader.loadAs("123", null);
+            fail();
+        } catch (NullPointerException e) {
+            assertEquals("Class for tag must be provided.", e.getMessage());
+        }
+    }
+
+    @SuppressWarnings("deprecation")
     public void testLoaderNullOptions() {
         try {
             new JavaBeanLoader<Bean>((LoaderOptions) null, BeanAccess.DEFAULT);
@@ -157,8 +170,8 @@
         assertEquals("bean:\n  id: 3\n  name: Test me.\nlist: null\nname: Name123\n", output);
         TypeDescription td = new TypeDescription(Bean3.class);
         td.putListPropertyType("list", Integer.class);
-        JavaBeanLoader<Bean3> loader = new JavaBeanLoader<Bean3>(td);
-        Bean3 parsed = loader.load(output);
+        Yaml loader = new Yaml(new Constructor(td));
+        Bean3 parsed = (Bean3) loader.load(output);
         assertEquals("Name123", parsed.getName());
     }
 
@@ -178,13 +191,29 @@
         assertEquals("bean:\n  id: 3\n  name: Test me.\nlist:\n- 13\n- 17\nname: Name123\n", output);
         TypeDescription td = new TypeDescription(Bean3.class);
         td.putListPropertyType("list", Integer.class);
-        JavaBeanLoader<Bean3> loader = new JavaBeanLoader<Bean3>(td);
-        Bean3 parsed = loader.load(output);
+        Yaml loader = new Yaml(new Constructor(td));
+        Bean3 parsed = (Bean3) loader.load(output);
         assertEquals("Name123", parsed.getName());
         List<Integer> parsedList = parsed.getList();
         assertEquals(2, parsedList.size());
     }
 
+    public void testTypeDescription3() {
+        Bean3 bean3 = new Bean3();
+        bean3.setName("Name123");
+        Bean bean = new Bean();
+        bean.setId(3);
+        bean.setName("Test me.");
+        bean3.setBean(bean);
+        JavaBeanDumper dumper = new JavaBeanDumper();
+        String output = dumper.dump(bean3);
+        assertEquals("bean:\n  id: 3\n  name: Test me.\nlist: null\nname: Name123\n", output);
+        TypeDescription td = new TypeDescription(Bean2.class);
+        Yaml loader = new Yaml(new Constructor(td));
+        Bean3 parsed = loader.loadAs(output, Bean3.class);// Bean3 must be taken
+        assertEquals("Name123", parsed.getName());
+    }
+
     public static class Bean3 {
         private String name;
         private Bean bean;
diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanTimeStampTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanTimeStampTest.java
index c4dc1bf..23041e7 100644
--- a/src/test/java/org/yaml/snakeyaml/JavaBeanTimeStampTest.java
+++ b/src/test/java/org/yaml/snakeyaml/JavaBeanTimeStampTest.java
@@ -38,9 +38,9 @@
         assertEquals(
                 "!!org.yaml.snakeyaml.JavaBeanWithSqlTimestamp\ndate: 2001-09-25T00:00:00Z\ntimestamp: 2001-09-09T01:46:40Z\n",
                 dumpStr);
-        JavaBeanLoader<JavaBeanWithSqlTimestamp> loader = new JavaBeanLoader<JavaBeanWithSqlTimestamp>(
+        Yaml loader = new Yaml();
+        JavaBeanWithSqlTimestamp javaBeanToLoad = loader.loadAs(dumpStr,
                 JavaBeanWithSqlTimestamp.class);
-        JavaBeanWithSqlTimestamp javaBeanToLoad = loader.load(dumpStr);
         assertEquals(stamp, javaBeanToLoad.getTimestamp());
         assertEquals(date, javaBeanToLoad.getDate());
     }
@@ -57,9 +57,9 @@
         Yaml yaml = new Yaml(options);
         String dumpStr = yaml.dump(javaBeanToDump);
         assertEquals("date: 2001-09-25T00:00:00Z\ntimestamp: 2001-09-09T01:46:40Z\n", dumpStr);
-        JavaBeanLoader<JavaBeanWithSqlTimestamp> loader = new JavaBeanLoader<JavaBeanWithSqlTimestamp>(
+        Yaml loader = new Yaml();
+        JavaBeanWithSqlTimestamp javaBeanToLoad = loader.loadAs(dumpStr,
                 JavaBeanWithSqlTimestamp.class);
-        JavaBeanWithSqlTimestamp javaBeanToLoad = loader.load(dumpStr);
         assertEquals(stamp, javaBeanToLoad.getTimestamp());
         assertEquals(date, javaBeanToLoad.getDate());
     }
diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
index 3f5f184..dc71394 100644
--- a/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
+++ b/src/test/java/org/yaml/snakeyaml/JavaBeanWithNullValuesTest.java
@@ -27,11 +27,11 @@
 import org.yaml.snakeyaml.representer.Representer;
 
 public class JavaBeanWithNullValuesTest extends TestCase {
-    private JavaBeanLoader<JavaBeanWithNullValues> loader;
+    private Yaml loader;
 
     @Override
     protected void setUp() throws Exception {
-        loader = new JavaBeanLoader<JavaBeanWithNullValues>(JavaBeanWithNullValues.class);
+        loader = new Yaml();
     }
 
     public void testNotNull() throws Exception {
@@ -49,7 +49,7 @@
         assertNotNull(parsed.getSqlDate());
         assertNotNull(parsed.getTimestamp());
         //
-        parsed = loader.load(dumpStr);
+        parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
         assertNotNull(parsed.getString());
         assertNotNull(parsed.getBoolean1());
         assertNotNull(parsed.getDate());
@@ -67,7 +67,7 @@
         JavaBeanWithNullValues parsed = (JavaBeanWithNullValues) yaml.load(dumpStr);
         assertNull(parsed.getString());
         //
-        parsed = loader.load(dumpStr);
+        parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
         assertNull(parsed.getString());
     }
 
@@ -119,7 +119,7 @@
         assertFalse("No explicit root tag must be used.",
                 dumpStr.contains("JavaBeanWithNullValues"));
         yaml = new Yaml(new CustomRepresenter(), options);
-        JavaBeanWithNullValues parsed = loader.load(dumpStr);
+        JavaBeanWithNullValues parsed = loader.loadAs(dumpStr, JavaBeanWithNullValues.class);
         assertNull(" expect null, got " + parsed.getBoolean1(), parsed.getBoolean1());
         assertNull(" expect null, got " + parsed.getString(), parsed.getString());
         assertEquals(1d, parsed.getDouble1());
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java
index 0a8a888..55ab552 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorMappingTest.java
@@ -56,7 +56,7 @@
         Resolver resolver = new Resolver();
         Composer composer = new Composer(parser, resolver);
         constructor.setComposer(composer);
-        return constructor.getSingleData();
+        return constructor.getSingleData(Object.class);
     }
 
     class CustomConstructor extends Constructor {
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java
index 68d6958..0c89598 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ConstructorSequenceTest.java
@@ -73,7 +73,7 @@
         Resolver resolver = new Resolver();
         Composer composer = new Composer(parser, resolver);
         constructor.setComposer(composer);
-        List<Object> result = (List<Object>) constructor.getSingleData();
+        List<Object> result = (List<Object>) constructor.getSingleData(Object.class);
         return result;
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java
index ccf248b..1e33df1 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java
@@ -24,7 +24,6 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
@@ -87,8 +86,8 @@
         String output = yaml.dump(c);
         assertEquals(Util.getLocalResource("javabeans/mycar-with-global-tag1.yaml"), output);
         // load
-        JavaBeanLoader<MyCar> beanLoader = new JavaBeanLoader<MyCar>(MyCar.class);
-        MyCar car = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        MyCar car = beanLoader.loadAs(output, MyCar.class);
         assertNotNull(car);
         assertEquals("00-FF-Q2", car.getPlate());
         assertEquals(5, car.getWheels().size());
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/template/VelocityTest.java b/src/test/java/org/yaml/snakeyaml/emitter/template/VelocityTest.java
index db4a5e1..753e42f 100644
--- a/src/test/java/org/yaml/snakeyaml/emitter/template/VelocityTest.java
+++ b/src/test/java/org/yaml/snakeyaml/emitter/template/VelocityTest.java
@@ -29,7 +29,6 @@
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.FlowStyle;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.immutable.Point;
@@ -66,8 +65,8 @@
         assertEquals(etalon.length(), output.length());
         assertEquals(etalon, output);
         // parse the YAML document
-        JavaBeanLoader<MyBean> loader = new JavaBeanLoader<MyBean>(MyBean.class);
-        MyBean parsedBean = loader.load(output);
+        Yaml loader = new Yaml();
+        MyBean parsedBean = loader.loadAs(output, MyBean.class);
         assertEquals(bean, parsedBean);
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/generics/BirdTest.java b/src/test/java/org/yaml/snakeyaml/generics/BirdTest.java
index 7aebefc..9fbe65e 100644
--- a/src/test/java/org/yaml/snakeyaml/generics/BirdTest.java
+++ b/src/test/java/org/yaml/snakeyaml/generics/BirdTest.java
@@ -21,7 +21,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.nodes.Tag;
 
@@ -40,13 +39,13 @@
         String output = yaml.dump(bird);
         Bird parsed;
         String javaVendor = System.getProperty("java.vm.name");
-        JavaBeanLoader<Bird> loader = new JavaBeanLoader<Bird>(Bird.class);
+        Yaml loader = new Yaml();
         if (GenericsBugDetector.isProperIntrospection()) {
             // no global tags
             System.out.println("java.vm.name: " + javaVendor);
             assertEquals("no global tags must be emitted.", "home: {height: 3}\nname: Eagle\n",
                     output);
-            parsed = loader.load(output);
+            parsed = loader.loadAs(output, Bird.class);
 
         } else {
             // with global tags
@@ -55,7 +54,7 @@
                             + javaVendor);
             assertEquals("global tags are inevitable here.",
                     "home: !!org.yaml.snakeyaml.generics.Nest {height: 3}\nname: Eagle\n", output);
-            parsed = loader.load(output);
+            parsed = loader.loadAs(output, Bird.class);
         }
         assertEquals(bird.getName(), parsed.getName());
         assertEquals(bird.getHome().getHeight(), parsed.getHome().getHeight());
diff --git a/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java b/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
index 2dcf141..f6fc380 100644
--- a/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
+++ b/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
@@ -21,7 +21,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 
@@ -114,9 +113,9 @@
         // System.out.println(doc);
         assertEquals(Util.getLocalResource("javabeans/genericArray-1.yaml"), doc);
         //
-        JavaBeanLoader<ArrayBean> beanLoader = new JavaBeanLoader<ArrayBean>(ArrayBean.class);
+        Yaml beanLoader = new Yaml();
         if (GenericsBugDetector.isProperIntrospection()) {
-            ArrayBean loaded = beanLoader.load(doc);
+            ArrayBean loaded = beanLoader.loadAs(doc, ArrayBean.class);
             assertEquals("ID556677", loaded.getId());
             assertEquals("Array3", loaded.getGa().getName());
             assertEquals(3, loaded.getGa().getHome().length);
diff --git a/src/test/java/org/yaml/snakeyaml/generics/ObjectValuesTest.java b/src/test/java/org/yaml/snakeyaml/generics/ObjectValuesTest.java
index f511c61..739df69 100644
--- a/src/test/java/org/yaml/snakeyaml/generics/ObjectValuesTest.java
+++ b/src/test/java/org/yaml/snakeyaml/generics/ObjectValuesTest.java
@@ -24,7 +24,7 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
+import org.yaml.snakeyaml.Yaml;
 
 public class ObjectValuesTest extends TestCase {
 
@@ -48,9 +48,8 @@
 
         JavaBeanDumper dumper = new JavaBeanDumper();
         String dumpedStr = dumper.dump(ov);
-
-        JavaBeanLoader<ObjectValues> loader = new JavaBeanLoader<ObjectValues>(ObjectValues.class);
-        ObjectValues ov2 = loader.load(dumpedStr);
+        Yaml loader = new Yaml();
+        ObjectValues ov2 = loader.loadAs(dumpedStr, ObjectValues.class);
 
         assertEquals(ov.getObject(), ov2.getObject());
         assertEquals(ov.getValues(), ov2.getValues());
@@ -79,10 +78,9 @@
 
         JavaBeanDumper dumper = new JavaBeanDumper();
         String dumpedStr = dumper.dump(ov);
-
-        JavaBeanLoader<ObjectValuesWithParam<String, Integer>> loader = new JavaBeanLoader<ObjectValuesWithParam<String, Integer>>(
+        Yaml loader = new Yaml();
+        ObjectValuesWithParam<String, Integer> ov2 = loader.loadAs(dumpedStr,
                 new ObjectValuesWithParam<String, Integer>().getClass());
-        ObjectValuesWithParam<String, Integer> ov2 = loader.load(dumpedStr);
 
         assertEquals(ov.getObject(), ov2.getObject());
         assertEquals(ov.getValues(), ov2.getValues());
diff --git a/src/test/java/org/yaml/snakeyaml/immutable/ShapeImmutableTest.java b/src/test/java/org/yaml/snakeyaml/immutable/ShapeImmutableTest.java
index fd50504..65fdbb4 100644
--- a/src/test/java/org/yaml/snakeyaml/immutable/ShapeImmutableTest.java
+++ b/src/test/java/org/yaml/snakeyaml/immutable/ShapeImmutableTest.java
@@ -18,7 +18,6 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 
@@ -134,8 +133,8 @@
 
     public void testShapeNoTags() {
         String source = Util.getLocalResource("immutable/shapeNoTags.yaml");
-        JavaBeanLoader<Shape> beanLoader = new JavaBeanLoader<Shape>(Shape.class);
-        Shape loaded = beanLoader.load(source);
+        Yaml beanLoader = new Yaml();
+        Shape loaded = beanLoader.loadAs(source, Shape.class);
         assertEquals(new Integer(123), loaded.getId());
         assertEquals("BLACK", loaded.getColor().getName());
         assertEquals(1.17, loaded.getPoint().getX());
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue10/BasicDumpTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue10/BasicDumpTest.java
index d249113..28a7ac8 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue10/BasicDumpTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue10/BasicDumpTest.java
@@ -22,7 +22,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 
@@ -93,8 +92,8 @@
         String etalon = Util.getLocalResource("javabeans/issue10-3.yaml");
         assertEquals(etalon.trim(), output.trim());
         // load
-        JavaBeanLoader<DataSources> beanLoader = new JavaBeanLoader<DataSources>(DataSources.class);
-        DataSources bean = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        DataSources bean = beanLoader.loadAs(output, DataSources.class);
         Iterator<DataSource> iter = bean.getDataSources().iterator();
         assertTrue(iter.next() instanceof JDBCDataSource);
         assertFalse("Must be DataSource.", iter.next() instanceof JDBCDataSource);
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue112/ParameterisedTypeLoadingTestCase.java b/src/test/java/org/yaml/snakeyaml/issues/issue112/ParameterisedTypeLoadingTestCase.java
index e82a00e..cf63770 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue112/ParameterisedTypeLoadingTestCase.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue112/ParameterisedTypeLoadingTestCase.java
@@ -24,7 +24,6 @@
 
 import org.junit.Test;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -34,9 +33,7 @@
     @Test
     public void testParameterisedTypeLoading() throws IOException {
         Yaml yamlParser = new Yaml(new Constructor(MyCompositeObject.class));
-
         MyCompositeObject obj = (MyCompositeObject) yamlParser.load(getInput());
-
         check(obj);
 
         // dump the object
@@ -47,11 +44,8 @@
 
     @Test
     public void testJavaBeanLoader() throws IOException {
-        JavaBeanLoader<MyCompositeObject> yamlParser = new JavaBeanLoader<MyCompositeObject>(
-                MyCompositeObject.class);
-
-        MyCompositeObject obj = yamlParser.load(getInput());
-
+        Yaml yamlParser = new Yaml();
+        MyCompositeObject obj = yamlParser.loadAs(getInput(), MyCompositeObject.class);
         check(obj);
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue40/DogFoodBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue40/DogFoodBeanTest.java
index 07df8bb..b08e8f4 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue40/DogFoodBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue40/DogFoodBeanTest.java
@@ -21,7 +21,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Yaml;
 
 public class DogFoodBeanTest extends TestCase {
@@ -56,8 +55,8 @@
         String text = dumper.dump(input);
         // System.out.println(text);
         assertEquals("decimal: 5.123\n", text);
-        JavaBeanLoader<DogFoodBean> loader = new JavaBeanLoader<DogFoodBean>(DogFoodBean.class);
-        DogFoodBean output = loader.load(text);
+        Yaml loader = new Yaml();
+        DogFoodBean output = loader.loadAs(text, DogFoodBean.class);
         assertEquals(input.getDecimal(), output.getDecimal());
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue47/ReadOnlyPropertiesTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue47/ReadOnlyPropertiesTest.java
index 3266490..590c31d 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue47/ReadOnlyPropertiesTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue47/ReadOnlyPropertiesTest.java
@@ -20,7 +20,7 @@
 
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
+import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.nodes.Tag;
 import org.yaml.snakeyaml.representer.Representer;
@@ -34,9 +34,8 @@
         // System.out.println(output);
         assertEquals("name: lunch\n", output);
         //
-        JavaBeanLoader<IncompleteBean> loader = new JavaBeanLoader<IncompleteBean>(
-                IncompleteBean.class);
-        IncompleteBean parsed = loader.load(output);
+        Yaml loader = new Yaml();
+        IncompleteBean parsed = loader.loadAs(output, IncompleteBean.class);
         assertEquals(bean.getName(), parsed.getName());
     }
 
@@ -51,10 +50,9 @@
         // System.out.println(output);
         assertEquals("{id: 10, name: lunch}\n", output);
         //
-        JavaBeanLoader<IncompleteBean> loader = new JavaBeanLoader<IncompleteBean>(
-                IncompleteBean.class);
+        Yaml loader = new Yaml();
         try {
-            loader.load(output);
+            loader.loadAs(output, IncompleteBean.class);
             fail("Setter is missing.");
         } catch (YAMLException e) {
             String message = e.getMessage();
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
index 36105e2..7218ff5 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
@@ -24,7 +24,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Yaml;
 
 public class CalendarTest extends TestCase {
@@ -43,8 +42,8 @@
         // System.out.println(output);
         assertEquals("calendar: 2001-09-08T17:46:40-8:00\nname: lunch\n", output);
         //
-        JavaBeanLoader<CalendarBean> loader = new JavaBeanLoader<CalendarBean>(CalendarBean.class);
-        CalendarBean parsed = loader.load(output);
+        Yaml loader = new Yaml();
+        CalendarBean parsed = loader.loadAs(output, CalendarBean.class);
         assertEquals(bean.getCalendar(), parsed.getCalendar());
     }
 
@@ -93,17 +92,16 @@
         // System.out.println(output);
         assertEquals(warning, "calendar: " + etalon + "\nname: lunch\n", output);
         //
-        JavaBeanLoader<CalendarBean> loader = new JavaBeanLoader<CalendarBean>(CalendarBean.class);
-        CalendarBean parsed = loader.load(output);
+        Yaml loader = new Yaml();
+        CalendarBean parsed = loader.loadAs(output, CalendarBean.class);
         assertFalse("TimeZone must deviate.", bean.getCalendar().equals(parsed.getCalendar()));
         assertEquals(bean.getCalendar().getTimeInMillis(), parsed.getCalendar().getTimeInMillis());
     }
 
     public void testLoadBean() {
-        JavaBeanLoader<CalendarBean> beanLoader = new JavaBeanLoader<CalendarBean>(
-                CalendarBean.class);
-        CalendarBean bean = beanLoader
-                .load("calendar:  2001-12-14t21:59:43.10-05:00\nname: dinner");
+        Yaml beanLoader = new Yaml();
+        CalendarBean bean = beanLoader.loadAs(
+                "calendar:  2001-12-14t21:59:43.10-05:00\nname: dinner", CalendarBean.class);
         assertEquals("dinner", bean.getName());
         Calendar calendar = bean.getCalendar();
         assertEquals(TimeZone.getTimeZone("GMT-5:00").getOffset(calendar.getTime().getTime()),
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue55/FieldListTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue55/FieldListTest.java
index 8e3082f..3f32f17 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue55/FieldListTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue55/FieldListTest.java
@@ -21,24 +21,24 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.introspector.BeanAccess;
 
 public class FieldListTest extends TestCase {
 
     public void testYaml() {
-        JavaBeanLoader<BlogField> beanLoader = new JavaBeanLoader<BlogField>(BlogField.class,
-                BeanAccess.FIELD);
-        BlogField rehydrated = (BlogField) beanLoader.load(Util
-                .getLocalResource("issues/issue55_2.txt"));
+        Yaml beanLoader = new Yaml();
+        beanLoader.setBeanAccess(BeanAccess.FIELD);
+        BlogField rehydrated = beanLoader.loadAs(Util.getLocalResource("issues/issue55_2.txt"),
+                BlogField.class);
         assertEquals(4, rehydrated.getPosts().size());
     }
 
     public void testFailureWithoutFieldAccess() {
-        JavaBeanLoader<BlogField> beanLoader = new JavaBeanLoader<BlogField>(BlogField.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(Util.getLocalResource("issues/issue55_2.txt"));
+            beanLoader.loadAs(Util.getLocalResource("issues/issue55_2.txt"), BlogField.class);
             fail("Private field must not be available");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Unable to find property 'posts'"));
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue55/JavaBeanListTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue55/JavaBeanListTest.java
index 4d4cc65..9aa872d 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue55/JavaBeanListTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue55/JavaBeanListTest.java
@@ -21,24 +21,24 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.introspector.BeanAccess;
 
 public class JavaBeanListTest extends TestCase {
 
     public void testYaml() {
-        JavaBeanLoader<BlogBean> beanLoader = new JavaBeanLoader<BlogBean>(BlogBean.class,
-                BeanAccess.FIELD);
-        BlogBean rehydrated = (BlogBean) beanLoader.load(Util
-                .getLocalResource("issues/issue55_2.txt"));
+        Yaml beanLoader = new Yaml();
+        beanLoader.setBeanAccess(BeanAccess.FIELD);
+        BlogBean rehydrated = (BlogBean) beanLoader.loadAs(
+                Util.getLocalResource("issues/issue55_2.txt"), BlogBean.class);
         assertEquals(4, rehydrated.getPosts().size());
     }
 
     public void testFailureWithoutFieldAccess() {
-        JavaBeanLoader<BlogBean> beanLoader = new JavaBeanLoader<BlogBean>(BlogBean.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(Util.getLocalResource("issues/issue55_2.txt"));
+            beanLoader.loadAs(Util.getLocalResource("issues/issue55_2.txt"), BlogBean.class);
             fail("Private field must not be available");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Unable to find property 'posts'"));
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue55/YamlFieldAccessCollectionTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue55/YamlFieldAccessCollectionTest.java
index 355b99a..89be26f 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue55/YamlFieldAccessCollectionTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue55/YamlFieldAccessCollectionTest.java
@@ -23,7 +23,6 @@
 
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.FlowStyle;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.introspector.BeanAccess;
@@ -38,8 +37,9 @@
         String serialized = yamlDumper.dump(original);
         // System.out.println(serialized);
         assertEquals(Util.getLocalResource("issues/issue55_1.txt"), serialized);
-        JavaBeanLoader<Blog> blogLoader = new JavaBeanLoader<Blog>(Blog.class, BeanAccess.FIELD);
-        Blog rehydrated = (Blog) blogLoader.load(serialized);
+        Yaml blogLoader = new Yaml();
+        blogLoader.setBeanAccess(BeanAccess.FIELD);
+        Blog rehydrated = blogLoader.loadAs(serialized, Blog.class);
         checkTestBlog(rehydrated);
     }
 
@@ -52,9 +52,9 @@
     }
 
     public void testYamlFailure() {
-        JavaBeanLoader<Blog> beanLoader = new JavaBeanLoader<Blog>(Blog.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(Util.getLocalResource("issues/issue55_1.txt"));
+            beanLoader.loadAs(Util.getLocalResource("issues/issue55_1.txt"), Blog.class);
             fail("BeanAccess.FIELD is required.");
         } catch (Exception e) {
             assertTrue(e.getMessage(), e.getMessage().contains("Unable to find property 'posts'"));
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
index a923fff..9fad7b8 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericListBeanTest.java
@@ -22,11 +22,11 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 public class GenericListBeanTest extends TestCase {
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @SuppressWarnings("unchecked")
     public void testGenericList() throws Exception {
         JavaBeanDumper beanDumper = new JavaBeanDumper();
         ListProvider<String> listProvider = new ListProvider<String>();
@@ -36,8 +36,8 @@
         // System.out.println(s);
         assertEquals("list:\n- foo\n- bar\n", s);
         // parse
-        JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);
-        ListProvider<String> listProvider2 = loader.load(s);
+        Yaml loader = new Yaml();
+        ListProvider<String> listProvider2 = loader.loadAs(s, ListProvider.class);
         assertEquals("foo", listProvider2.getList().get(0));
         assertEquals("bar", listProvider2.getList().get(1));
         assertEquals(listProvider, listProvider2);
@@ -59,8 +59,8 @@
         String etalon = Util.getLocalResource("issues/issue61-1.yaml");
         assertEquals(etalon, s);
         // parse
-        JavaBeanLoader<ListProvider> loader = new JavaBeanLoader<ListProvider>(ListProvider.class);
-        ListProvider listProvider2 = loader.load(s);
+        Yaml loader = new Yaml();
+        ListProvider listProvider2 = loader.loadAs(s, ListProvider.class);
         Bean foo2 = (Bean) listProvider2.getList().get(0);
         assertEquals("foo", foo2.getName());
         assertEquals(0, foo2.getNumber());
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
index 40a1008..60c2d37 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericMapBeanTest.java
@@ -22,11 +22,11 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 public class GenericMapBeanTest extends TestCase {
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @SuppressWarnings("unchecked")
     public void testGenericMap() throws Exception {
         JavaBeanDumper beanDumper = new JavaBeanDumper();
         MapProvider<String, Integer> listProvider = new MapProvider<String, Integer>();
@@ -36,8 +36,8 @@
         // System.out.println(s);
         assertEquals("map:\n  foo: 17\n  bar: 19\n", s);
         // parse
-        JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);
-        MapProvider<String, Integer> listProvider2 = loader.load(s);
+        Yaml loader = new Yaml();
+        MapProvider<String, Integer> listProvider2 = loader.loadAs(s, MapProvider.class);
         assertEquals(new Integer(17), listProvider2.getMap().get("foo"));
         assertEquals(new Integer(19), listProvider2.getMap().get("bar"));
         assertEquals(listProvider, listProvider2);
@@ -59,8 +59,8 @@
         String etalon = Util.getLocalResource("issues/issue61-2.yaml");
         assertEquals(etalon, s);
         // parse
-        JavaBeanLoader<MapProvider> loader = new JavaBeanLoader<MapProvider>(MapProvider.class);
-        MapProvider listProvider2 = loader.load(s);
+        Yaml loader = new Yaml();
+        MapProvider listProvider2 = loader.loadAs(s, MapProvider.class);
         Bean foo2 = (Bean) listProvider2.getMap().get("foo");
         assertEquals("foo", foo2.getName());
         assertEquals(0, foo2.getNumber());
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java
index b23438e..3a067a6 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue72/CollectionTest.java
@@ -23,7 +23,7 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
+import org.yaml.snakeyaml.Yaml;
 
 public class CollectionTest extends TestCase {
 
@@ -32,9 +32,8 @@
         JavaBeanDumper dumper = new JavaBeanDumper();
         String doc = dumper.dump(bean);
         // System.out.println(doc);
-        JavaBeanLoader<CollectionList> beanLoader = new JavaBeanLoader<CollectionList>(
-                CollectionList.class);
-        CollectionList parsed = beanLoader.load(doc);
+        Yaml beanLoader = new Yaml();
+        CollectionList parsed = beanLoader.loadAs(doc, CollectionList.class);
         assertTrue(parsed.getNames().contains("aaa"));
         assertTrue(parsed.getNames().contains("bbb"));
         assertEquals(2, parsed.getNames().size());
@@ -63,9 +62,8 @@
         JavaBeanDumper dumper = new JavaBeanDumper();
         String doc = dumper.dump(bean);
         // System.out.println(doc);
-        JavaBeanLoader<CollectionSet> beanLoader = new JavaBeanLoader<CollectionSet>(
-                CollectionSet.class);
-        CollectionSet parsed = beanLoader.load(doc);
+        Yaml beanLoader = new Yaml();
+        CollectionSet parsed = beanLoader.loadAs(doc, CollectionSet.class);
         assertTrue(parsed.getRoles().contains(11));
         assertTrue(parsed.getRoles().contains(13));
         assertEquals(2, parsed.getRoles().size());
@@ -88,5 +86,4 @@
             this.roles = roles;
         }
     }
-
 }
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue73/SetAsSequenceTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue73/SetAsSequenceTest.java
index e04d1a9..0edd7be 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue73/SetAsSequenceTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue73/SetAsSequenceTest.java
@@ -24,7 +24,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.introspector.BeanAccess;
@@ -67,8 +66,9 @@
     public void testYaml() {
         String serialized = Util.getLocalResource("issues/issue73-2.txt");
         // System.out.println(serialized);
-        JavaBeanLoader<Blog> beanLoader = new JavaBeanLoader<Blog>(Blog.class, BeanAccess.FIELD);
-        Blog rehydrated = beanLoader.load(serialized);
+        Yaml beanLoader = new Yaml();
+        beanLoader.setBeanAccess(BeanAccess.FIELD);
+        Blog rehydrated = beanLoader.loadAs(serialized, Blog.class);
         checkTestBlog(rehydrated);
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue74/ArrayBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue74/ArrayBeanTest.java
index 38aa491..2028aed 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue74/ArrayBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue74/ArrayBeanTest.java
@@ -22,8 +22,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 public class ArrayBeanTest extends TestCase {
 
@@ -46,8 +46,8 @@
         String output = beanDumper.dump(bean);
         // System.out.println(output);
         assertEquals(Util.getLocalResource("issues/issue74-array1.txt"), output);
-        JavaBeanLoader<ArrayBean> beanLoader = new JavaBeanLoader<ArrayBean>(ArrayBean.class);
-        ArrayBean parsed = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        ArrayBean parsed = beanLoader.loadAs(output, ArrayBean.class);
         // System.out.println(parsed);
         assertEquals(3, parsed.getMembers().length);
         assertEquals(2, parsed.openMembers.length);
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue82/PropOrderInfluenceWhenAliasedInGenericCollectionTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue82/PropOrderInfluenceWhenAliasedInGenericCollectionTest.java
index baf4e11..37f9782 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue82/PropOrderInfluenceWhenAliasedInGenericCollectionTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue82/PropOrderInfluenceWhenAliasedInGenericCollectionTest.java
@@ -26,7 +26,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -243,8 +242,8 @@
         JavaBeanDumper dumper = new JavaBeanDumper();
         String dump2 = dumper.dump(customerAB);
         // System.out.println(dump2);
-        JavaBeanLoader<CustomerAB> loader = new JavaBeanLoader<CustomerAB>(CustomerAB.class);
-        CustomerAB parsed = loader.load(dump2);
+        Yaml loader = new Yaml();
+        CustomerAB parsed = loader.loadAs(dump2, CustomerAB.class);
         assertNotNull(parsed);
     }
 
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/ConstructEmptyBeanTest.java b/src/test/java/org/yaml/snakeyaml/javabeans/ConstructEmptyBeanTest.java
index 1d62bf2..606e260 100644
--- a/src/test/java/org/yaml/snakeyaml/javabeans/ConstructEmptyBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/ConstructEmptyBeanTest.java
@@ -21,7 +21,6 @@
 
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Yaml;
 
 public class ConstructEmptyBeanTest extends TestCase {
@@ -41,9 +40,10 @@
      * global tag is correct (but ignored)
      */
     public void testEmptyBean1() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
-        EmptyBean bean = beanLoader
-                .load("!!org.yaml.snakeyaml.javabeans.ConstructEmptyBeanTest$EmptyBean {}");
+        Yaml beanLoader = new Yaml();
+        EmptyBean bean = beanLoader.loadAs(
+                "!!org.yaml.snakeyaml.javabeans.ConstructEmptyBeanTest$EmptyBean {}",
+                EmptyBean.class);
         assertNotNull(bean);
         assertNull(bean.getFirstName());
         assertEquals(5, bean.getHatSize());
@@ -53,8 +53,8 @@
      * global tag is ignored
      */
     public void testEmptyBean2() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
-        EmptyBean bean = beanLoader.load("!!Bla-bla-bla {}");
+        Yaml beanLoader = new Yaml();
+        EmptyBean bean = beanLoader.loadAs("!!Bla-bla-bla {}", EmptyBean.class);
         assertNotNull(bean);
         assertNull(bean.getFirstName());
         assertEquals(5, bean.getHatSize());
@@ -64,8 +64,8 @@
      * no tag
      */
     public void testEmptyBean3() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
-        EmptyBean bean = beanLoader.load("{   }");
+        Yaml beanLoader = new Yaml();
+        EmptyBean bean = beanLoader.loadAs("{   }", EmptyBean.class);
         assertNotNull(bean);
         assertNull(bean.getFirstName());
         assertEquals(5, bean.getHatSize());
@@ -75,8 +75,8 @@
      * empty document
      */
     public void testEmptyBean4() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
-        EmptyBean bean = beanLoader.load("");
+        Yaml beanLoader = new Yaml();
+        EmptyBean bean = beanLoader.loadAs("", EmptyBean.class);
         assertNull(bean);
     }
 
@@ -84,8 +84,8 @@
      * local tag is ignored
      */
     public void testEmptyBean5() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
-        EmptyBean bean = beanLoader.load("!Bla-bla-bla {}");
+        Yaml beanLoader = new Yaml();
+        EmptyBean bean = beanLoader.loadAs("!Bla-bla-bla {}", EmptyBean.class);
         assertNotNull(bean);
         assertNull(bean.getFirstName());
         assertEquals(5, bean.getHatSize());
@@ -95,9 +95,9 @@
      * invalid document
      */
     public void testEmptyBean6() throws IOException {
-        JavaBeanLoader<EmptyBean> beanLoader = new JavaBeanLoader<EmptyBean>(EmptyBean.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load("{");
+            beanLoader.loadAs("{", EmptyBean.class);
             fail("Invalid document provided.");
         } catch (Exception e) {
             assertEquals(
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/HouseTest.java b/src/test/java/org/yaml/snakeyaml/javabeans/HouseTest.java
index 9012b7d..0cae5c6 100644
--- a/src/test/java/org/yaml/snakeyaml/javabeans/HouseTest.java
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/HouseTest.java
@@ -24,9 +24,10 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
 
 public class HouseTest extends TestCase {
     /**
@@ -56,8 +57,8 @@
         String output2 = beanDumper.dump(house);
         assertEquals(etalon, output2);
         // load
-        JavaBeanLoader<House> beanLoader = new JavaBeanLoader<House>(House.class);
-        House loadedHouse = beanLoader.load(yaml);
+        Yaml beanLoader = new Yaml();
+        House loadedHouse = beanLoader.loadAs(yaml, House.class);
         assertNotNull(loadedHouse);
         assertEquals("Wall Street", loadedHouse.getStreet());
         // dump again
@@ -91,11 +92,14 @@
         // load
         TypeDescription description = new TypeDescription(House.class);
         description.putListPropertyType("rooms", Room.class);
-        JavaBeanLoader<House> beanLoader = new JavaBeanLoader<House>(description);
-        House loadedHouse = beanLoader.load(yaml);
+        Yaml beanLoader = new Yaml(new Constructor(description));
+        House loadedHouse = (House) beanLoader.load(yaml);
+        House loadedHouse2 = (House) beanLoader.loadAs(yaml, House.class);
         assertNotNull(loadedHouse);
+        assertFalse(loadedHouse == loadedHouse2);
         assertEquals("Wall Street", loadedHouse.getStreet());
         assertEquals(1, loadedHouse.getNumber());
+        assertEquals(1, loadedHouse2.getNumber());
         FrontDoor fdoor = loadedHouse.getFrontDoor();
         assertEquals(frontDoor.getId(), fdoor.getId());
         assertEquals(frontDoor.getHeight(), fdoor.getHeight());
@@ -132,8 +136,8 @@
         String etalon = Util.getLocalResource("javabeans/house-dump2.yaml");
         assertEquals(etalon, yaml);
         // load
-        JavaBeanLoader<House> beanLoader = new JavaBeanLoader<House>(House.class);
-        House loadedHouse = beanLoader.load(yaml);
+        Yaml beanLoader = new Yaml();
+        House loadedHouse = beanLoader.loadAs(yaml, House.class);
         assertNotNull(loadedHouse);
         assertEquals("Wall Street", loadedHouse.getStreet());
         // dump again
diff --git a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
index 3ffa34d..674e6d5 100644
--- a/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/javabeans/TriangleBeanTest.java
@@ -19,7 +19,7 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
+import org.yaml.snakeyaml.Yaml;
 
 public class TriangleBeanTest extends TestCase {
 
@@ -34,9 +34,8 @@
         assertEquals(
                 "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n  name: Triangle25\n",
                 output);
-        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
-                TriangleBean.class);
-        TriangleBean loadedBean = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        TriangleBean loadedBean = beanLoader.loadAs(output, TriangleBean.class);
         assertNotNull(loadedBean);
         assertEquals("Bean25", loadedBean.getName());
         assertEquals(7, loadedBean.getShape().process());
@@ -44,10 +43,9 @@
 
     public void testClassNotFound() {
         String output = "name: Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle777\n  name: Triangle25\n";
-        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
-                TriangleBean.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(output);
+            beanLoader.loadAs(output, TriangleBean.class);
             fail("Class not found expected.");
         } catch (Exception e) {
             assertEquals(
@@ -61,10 +59,9 @@
      */
     public void testClassAndTag() {
         String output = "name: !!whatever Bean25\nshape: !!org.yaml.snakeyaml.javabeans.Triangle\n  name: Triangle25\n";
-        JavaBeanLoader<TriangleBean> beanLoader = new JavaBeanLoader<TriangleBean>(
-                TriangleBean.class);
+        Yaml beanLoader = new Yaml();
         try {
-            beanLoader.load(output);
+            beanLoader.loadAs(output, TriangleBean.class);
             fail("Runtime class has less priority then an explicit tag");
         } catch (Exception e) {
             assertEquals(
diff --git a/src/test/java/org/yaml/snakeyaml/recursive/HumanTest.java b/src/test/java/org/yaml/snakeyaml/recursive/HumanTest.java
index bf00892..e27ad7d 100644
--- a/src/test/java/org/yaml/snakeyaml/recursive/HumanTest.java
+++ b/src/test/java/org/yaml/snakeyaml/recursive/HumanTest.java
@@ -32,7 +32,6 @@
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.FlowStyle;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
@@ -139,9 +138,9 @@
         assertEquals(etalon, output);
         TypeDescription humanDescription = new TypeDescription(Human.class);
         humanDescription.putMapPropertyType("children", Human.class, Object.class);
-        JavaBeanLoader<Human> beanLoader = new JavaBeanLoader<Human>(humanDescription);
+        Yaml beanLoader = new Yaml(new Constructor(humanDescription));
         //
-        Human son2 = beanLoader.load(output);
+        Human son2 = beanLoader.loadAs(output, Human.class);
         assertNotNull(son2);
         assertEquals("Son", son.getName());
 
@@ -212,9 +211,9 @@
         assertEquals(etalon, output);
         TypeDescription humanDescription = new TypeDescription(Human.class);
         humanDescription.putMapPropertyType("children", Human.class, Object.class);
-        JavaBeanLoader<Human> beanLoader = new JavaBeanLoader<Human>(humanDescription);
+        Yaml beanLoader = new Yaml(new Constructor(humanDescription));
         //
-        Human son2 = beanLoader.load(output);
+        Human son2 = beanLoader.loadAs(output, Human.class);
         assertNotNull(son2);
         assertEquals("Son", son.getName());
 
@@ -634,9 +633,9 @@
         assertEquals(etalon, output);
         TypeDescription humanDescription = new TypeDescription(Human.class);
         humanDescription.putMapPropertyType("children", Human.class, Object.class);
-        JavaBeanLoader<Human> beanLoader = new JavaBeanLoader<Human>(humanDescription);
+        Yaml beanLoader = new Yaml(new Constructor(humanDescription));
         //
-        Human son2 = beanLoader.load(output);
+        Human son2 = beanLoader.loadAs(output, Human.class);
         assertNotNull(son2);
         assertEquals("Son", son.getName());
 
@@ -659,5 +658,4 @@
         // check if hashCode is correct
         validateSet(children2);
     }
-
 }
diff --git a/src/test/java/org/yaml/snakeyaml/recursive/generics/HumanGenericsTest.java b/src/test/java/org/yaml/snakeyaml/recursive/generics/HumanGenericsTest.java
index 929a2e8..e8ba439 100644
--- a/src/test/java/org/yaml/snakeyaml/recursive/generics/HumanGenericsTest.java
+++ b/src/test/java/org/yaml/snakeyaml/recursive/generics/HumanGenericsTest.java
@@ -31,7 +31,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
@@ -99,8 +98,8 @@
         String etalon = Util.getLocalResource("recursive/generics/no-children-2.yaml");
         assertEquals(etalon, output);
         //
-        JavaBeanLoader<HumanGen> loader = new JavaBeanLoader<HumanGen>(HumanGen.class);
-        HumanGen father2 = (HumanGen) loader.load(etalon);
+        Yaml loader = new Yaml();
+        HumanGen father2 = (HumanGen) loader.loadAs(etalon, HumanGen.class);
         assertNotNull(father2);
         assertEquals("Father", father2.getName());
         assertEquals("Mother", father2.getPartner().getName());
@@ -231,9 +230,9 @@
         // load
         TypeDescription humanDescription = new TypeDescription(HumanGen2.class);
         humanDescription.putMapPropertyType("children", HumanGen2.class, String.class);
-        JavaBeanLoader<HumanGen2> beanLoader = new JavaBeanLoader<HumanGen2>(humanDescription);
+        Yaml beanLoader = new Yaml(new Constructor(humanDescription));
         //
-        HumanGen2 son2 = beanLoader.load(output);
+        HumanGen2 son2 = beanLoader.loadAs(output, HumanGen2.class);
         assertNotNull(son2);
         assertEquals("Son", son.getName());
 
diff --git a/src/test/java/org/yaml/snakeyaml/ruby/RubyTest.java b/src/test/java/org/yaml/snakeyaml/ruby/RubyTest.java
index 94c4d61..c43e3dd 100644
--- a/src/test/java/org/yaml/snakeyaml/ruby/RubyTest.java
+++ b/src/test/java/org/yaml/snakeyaml/ruby/RubyTest.java
@@ -19,7 +19,6 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
@@ -48,8 +47,8 @@
         assertFalse("No tags expected.", output.contains("Sub1"));
         // System.out.println(output);
         // parse back. Without tags it shall still work
-        JavaBeanLoader<TestObject> beanLoader = new JavaBeanLoader<TestObject>(TestObject.class);
-        TestObject result2 = beanLoader.load(output);
+        Yaml beanLoader = new Yaml();
+        TestObject result2 = beanLoader.loadAs(output, TestObject.class);
         assertEquals(0, result2.getSub1().getAtt2());
         assertEquals("MyString", result2.getSub2().getAtt1());
         assertEquals(1, result2.getSub2().getAtt2().size());
diff --git a/src/test/java/org/yaml/snakeyaml/stress/ParallelTest.java b/src/test/java/org/yaml/snakeyaml/stress/ParallelTest.java
index 4a27b01..0d6020a 100644
--- a/src/test/java/org/yaml/snakeyaml/stress/ParallelTest.java
+++ b/src/test/java/org/yaml/snakeyaml/stress/ParallelTest.java
@@ -21,8 +21,8 @@
 import junit.framework.TestCase;
 
 import org.yaml.snakeyaml.Invoice;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test that Yaml instances are independent and can be used in multiple threads.
@@ -58,11 +58,11 @@
 
         public void run() {
             System.out.println("Started: " + id);
-            JavaBeanLoader<Invoice> loader = new JavaBeanLoader<Invoice>(Invoice.class);
+            Yaml loader = new Yaml();
             long time1 = System.nanoTime();
             int cycles = 200;
             for (int i = 0; i < cycles; i++) {
-                Invoice invoice = loader.load(doc);
+                Invoice invoice = loader.loadAs(doc, Invoice.class);
                 assertNotNull(invoice);
             }
             long time2 = System.nanoTime();
diff --git a/src/test/java/org/yaml/snakeyaml/stress/StressEmitterTest.java b/src/test/java/org/yaml/snakeyaml/stress/StressEmitterTest.java
index 53e075e..aec885d 100644
--- a/src/test/java/org/yaml/snakeyaml/stress/StressEmitterTest.java
+++ b/src/test/java/org/yaml/snakeyaml/stress/StressEmitterTest.java
@@ -24,8 +24,8 @@
 
 import org.yaml.snakeyaml.Invoice;
 import org.yaml.snakeyaml.JavaBeanDumper;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
+import org.yaml.snakeyaml.Yaml;
 
 public class StressEmitterTest extends TestCase {
 
@@ -38,8 +38,9 @@
     }
 
     public void testPerformance() throws IOException {
-        JavaBeanLoader<Invoice> loader = new JavaBeanLoader<Invoice>(Invoice.class);
-        Invoice invoice = loader.load(Util.getLocalResource("specification/example2_27.yaml"));
+        Yaml loader = new Yaml();
+        Invoice invoice = loader.loadAs(Util.getLocalResource("specification/example2_27.yaml"),
+                Invoice.class);
         JavaBeanDumper dumper = new JavaBeanDumper();
         long time1 = System.nanoTime();
         dumper.dump(invoice);
diff --git a/src/test/java/org/yaml/snakeyaml/stress/StressTest.java b/src/test/java/org/yaml/snakeyaml/stress/StressTest.java
index 7ffed96..701f1b1 100644
--- a/src/test/java/org/yaml/snakeyaml/stress/StressTest.java
+++ b/src/test/java/org/yaml/snakeyaml/stress/StressTest.java
@@ -23,7 +23,6 @@
 import junit.framework.TestSuite;
 
 import org.yaml.snakeyaml.Invoice;
-import org.yaml.snakeyaml.JavaBeanLoader;
 import org.yaml.snakeyaml.Util;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -50,20 +49,20 @@
         float duration = (time2 - time1) / 1000000;
         System.out.println("Init was " + duration + " ms.");
 
-        JavaBeanLoader<Invoice> loader = new JavaBeanLoader<Invoice>(Invoice.class);
+        Yaml loader = new Yaml();
         time1 = System.nanoTime();
-        loader.load(doc);
+        loader.loadAs(doc, Invoice.class);
         time2 = System.nanoTime();
         duration = (time2 - time1) / 1000000;
         System.out.println("\nSingle load was " + duration + " ms.");
 
-        loader = new JavaBeanLoader<Invoice>(Invoice.class);
+        loader = new Yaml();
         int[] range = new int[] { 1000, 2000 /* , 4000, 8000 */};
         System.out.println("\nOne instance.");
         for (int number : range) {
             time1 = System.nanoTime();
             for (int i = 0; i < number; i++) {
-                loader.load(doc);
+                loader.loadAs(doc, Invoice.class);
             }
             time2 = System.nanoTime();
             duration = ((time2 - time1) / 1000000) / (float) number;
@@ -79,8 +78,8 @@
         for (int number : range) {
             time1 = System.nanoTime();
             for (int i = 0; i < number; i++) {
-                loader = new JavaBeanLoader<Invoice>(Invoice.class);
-                loader.load(doc);
+                loader = new Yaml();
+                loader.loadAs(doc, Invoice.class);
             }
             time2 = System.nanoTime();
             duration = ((time2 - time1) / 1000000) / (float) number;
