Normally I think 1.5k Resistors as pull-ups should be enough. Also your drive strength is already high enough.
You have three options to try:
- change the pull ups to 1k and meassure again. Compare if the Signal is better or the same. Don't use less than 1k!
- Can you change the slew-rate to 2?
- Can you use a active '1' instead of 'Z' for bits which are really high on the bus. Use 'Z' for inactive, ACK and data-receive.
I once had also written an custom I2C-Core and I used '1' for all active high Bits generated by the master. As I remember, my bus also shows this "shark-fins" on edges from '0' to 'z' but not from '0' to '1'.