Here the best solution would be the area stuff. It can be used as a sort of filter for pathfinding.
In your example you need two different area ids like land and water.
The xml code for the ground objects would look like:
<object id="water1" namespace="grassland_tileset" blocking="0" static="1" area_id="water">
<object id="ground1" namespace="grassland_tileset" blocking="0" static="1" area_id="land">
For the units:
<object id="land_unit" namespace="grassland_tileset" blocking="1" static="0">
<walkable_area id="land"/>
...
...
<object id="amphibious_unit" namespace="grassland_tileset" blocking="1" static="0">
<walkable_area id="water"/>
<walkable_area id="land"/>
...
...
Cliffs and hills can still be set to blocking like the units or buildings.
I hope that helps

With the cost property it's possible to make movement on cells cheaper or more expensive. So if your ground have different costs the units will try to move on the cheapest terrain, as example your map could have land with normal cost, swamp with 2x cost and streets with 0.5x. So the units would prefer the streets but would also use both other terrains.
The cell speed is similar but the change concerns only the real movement speed.