It rather depends on how much changes from C (old phone) to B (new phone). Using phones as an example is quite good because an old phone conceptually does the same as a new phone - it makes phone calls.
The difficultly comes when the implementation of C is tied very tightly to how the phone works. Lets say for example that the old phone insists on using a circular ring that you turn to select the number to dial rather than a key pad. In that situation, if you have complete control of the code, then you might want to try and put in a layer of abstraction between the interface and the old phone. The abstraction layer would capture just what it means to be a phone and nothing more.
Once you have the abstraction layer you can then choose whether you extend the old phone to create your new phone or create a new implementation. Either way it should be easier than you have now as the old phone will contain far less code and only those bits that are specific to it.