Yes, this is perfectly acceptable.
When you use <c:forEach> to iterate over a Map, each item in the iteration is an instance of Map.Entry. So given your example:
<c:forEach var="type" items="${types}">
Key is ${type.key}
Value is ${type.value}
</c:forEach>