diff --git a/java/src/main/java/org/msgpack/template/CollectionTemplate.java b/java/src/main/java/org/msgpack/template/CollectionTemplate.java
index b88500c3..31a937ef 100644
--- a/java/src/main/java/org/msgpack/template/CollectionTemplate.java
+++ b/java/src/main/java/org/msgpack/template/CollectionTemplate.java
@@ -18,10 +18,14 @@
 package org.msgpack.template;
 
 import java.util.Collection;
-import java.util.List;
 import java.util.LinkedList;
 import java.io.IOException;
-import org.msgpack.*;
+
+import org.msgpack.MessagePackObject;
+import org.msgpack.MessageTypeException;
+import org.msgpack.Packer;
+import org.msgpack.Template;
+import org.msgpack.Unpacker;
 
 public class CollectionTemplate implements Template {
 	public static void load() { }
@@ -32,47 +36,53 @@ public class CollectionTemplate implements Template {
 		this.elementTemplate = elementTemplate;
 	}
 
+	@SuppressWarnings("unchecked")
 	public void pack(Packer pk, Object target) throws IOException {
-		if(!(target instanceof Collection)) {
-			throw new MessageTypeException();
+		if (! (target instanceof Collection)) {
+			if (target == null) {
+				throw new MessageTypeException(new NullPointerException("target is null."));
+			}
+			throw new MessageTypeException("target is not Collection type: " + target.getClass());
 		}
-		Collection<Object> collection = (Collection<Object>)target;
+		Collection<Object> collection = (Collection<Object>) target;
 		pk.packArray(collection.size());
 		for(Object element : collection) {
 			elementTemplate.pack(pk, element);
 		}
 	}
 
+	@SuppressWarnings("unchecked")
 	public Object unpack(Unpacker pac, Object to) throws IOException, MessageTypeException {
 		int length = pac.unpackArray();
-		List<Object> list;
+		Collection<Object> c;
 		if(to == null) {
-			list = new LinkedList<Object>();
+			c = new LinkedList<Object>();
 		} else {
 			// TODO: optimize if list is instanceof ArrayList
-			list = (List<Object>)to;
-			list.clear();
+			c = (Collection<Object>) to;
+			c.clear();
 		}
 		for(; length > 0; length--) {
-			list.add( elementTemplate.unpack(pac, null) );
+			c.add(elementTemplate.unpack(pac, null));
 		}
-		return list;
+		return c;
 	}
 
+	@SuppressWarnings("unchecked")
 	public Object convert(MessagePackObject from, Object to) throws MessageTypeException {
 		MessagePackObject[] array = from.asArray();
-		List<Object> list;
+		Collection<Object> c;
 		if(to == null) {
-			list = new LinkedList<Object>();
+			c = new LinkedList<Object>();
 		} else {
 			// TODO: optimize if list is instanceof ArrayList
-			list = (List<Object>)to;
-			list.clear();
+			c = (Collection<Object>) to;
+			c.clear();
 		}
 		for(MessagePackObject element : array) {
-			list.add( elementTemplate.convert(element, null) );
+			c.add(elementTemplate.convert(element, null));
 		}
-		return list;
+		return c;
 	}
 
 	static {