You can't migrate a private channel over to public, so the only way to free up that vanity code for use in a public channel is to change it on the private channel, then publish a new public channel. Anyone with the private channel already installed, will keep it, but they won't automatically switch over to the new public channel. I think your last statement is correct. Ultimately you'll end up with 3 channels. What you could do is update the legacy private channel so it puts up a message then redirects the user to the channel store to install the public version. That way, anyone running the legacy channel will know they need to upgrade/update.
As for the new channel IDs, as soon as you create the new channel, the ID is reserved for it, whether it gets published or not. Depending on where you look the unpublished code might have a unique hex identifier tacked on the end to prevent it from conflicting with the published version, just ignore that for your upgrade code (ex. 12345_abcd vs. 12345).
My Channels: http://roku.permanence.com - Twitter: @TheEndlessDev
Instant Watch Browser (NetflixIWB), Aquarium Screensaver (AQUARIUM), Clever Clocks Screensaver (CLEVERCLOCKS), iTunes Podcasts (ITPC), My Channels (MYCHANNELS)