We used pg_upgrade recently for migrating from 8.3 -> 9.4 (the last version which supports 8.3), and it went nice. We had some custom functions in C, and pg_upgrade is a disciplined way to deal with the migration
I would be curious how that worked since the documentation states the old version must be at least 8.4.7 for pg_upgrade to work.