It should be possible to use QgsProject also as a non-singleton. This would allow reading of multiple project files:
A big +1
My grep gives me ~700 calls to QgsProject::instance() in src, 300 for QgsMapLayerRegistry::instance().
For core it's down to 156 and 104, so it's a lot of work but replacing the calls by either functions parameter (if only used in member function) or by an additional member passed to ctor seems the way to go IMO. It breaks the API, but it's not rocket science either, and with down->top approach it can be done step by step.
Once done, the ::instance could be made unusable if included in core components (e.g. ifdef that fails to compile).
Fixed in qgis/QGIS@57ff36b