I doubt that the ATmega32U is actually damaged. When I was developing my Epsilon code I did all kinds of stupid things and never managed to damage mine.
There are really only three permanent changes that you can make to the microcontroller. One, program flash memory. This is what you do when you load code and as long as the bootloader is working, you're fine. Two, program EEPROM. Unless your code makes use of it, then it doesn't really matter at all what's in there. Three is the embedded fuses. These are where you can screw things up. In the entire length of my keyboard projects, I never had a reason to change any of the fuses. If you changed them around while trying to get your I2C to work, then it is conceivable that something changed that won't be fixed by loading old code. However, It's pretty unlikely that someone could change those without being aware of it.
My advice is to dive into the code. Check everything to make sure you're running the code you expect. Start with the most basic of programs to verify that works correctly, then build from there. That's what I did. I'd have issues where nothing seemed to work, and I'd have to start with an LED blinking program, then add matrix scanning, then USB, etc. It can be a real pain in the arse to debug an embedded project without an ICE debugger. That's why as soon as my code was working well enough, I added a debug module that let me record events and examine memory.