Well, one thing you could do is make multiple submarine charsets, each in ascending order of size, and make a parallell process which says that if the shift button is being presssed, change the player sprite to a larger version of itself, then wait, say, 3 frames, then keep repeating that so that it looks like the submarine is moving upward. Then you could transfer the player to an ocean tileset with the appropriate passability settings, and change the sprite into a boat sprite. You could also replace the largest submarine sprite with a half-sub-half-boat sprite to make a better effect.
As for the airship, do the same thing, just keep making it smaller, and don't change maps; simply transform the sprite into a boat that looks like it's sailing and not flying. EDIT: Actually, do change maps, just don't fade. Once you become a boat, you won't be able to travel on land, so you'll have to have another map with the right passability settings.
Your last question is the simplest. Once you've changed the sprite, find a way to render that parallel process useless, like turning on a switch which is the condition for a page in the submarine-changing event in which there is absolutely nothing.
Sorry if this is a bit confusing; I'm not good at explaining, but let me know if this helps.