Just updated to v 1.2.1 with a bunch of optimizations and improvements .
As always, You can find the latest version on Github here -->
SPIFlash Library for Arduino v1.2.1 A ZIP file is also attached to this post.

My apologies for not getting on here in a while. It was a very busy month at Uni with the semester coming to an end and field trip season starting up. I've only just managed to get back on now.
@Graham I haven't played around with the other chips or looked at their datasheets yet, so thank you for pointing it out. It'll be the next thing I get on to.

@Chuck Unfortunately all the erase functions just erase, thanks to the Uno's 2K RAM. I can't think of any way to get around it without resorting to what you've done with external SPI RAM. The onboard RAM also limits the use of the readBytes() and writeBytes() functions in the latest version of the library.

I've been considering tossing in some FRAM. I just got some samples from Fujitsu and I'm waiting for a few components to arrive from Element14 before I cook up some breakout boards in the toaster. I'll test them out and post the results ASAP.

Good luck with the Kickstarter!

@Rob Thanks for the feedback.

The latest version of the library does not have _readPage() and _writePage() anymore. It also has page_number and offset checking built in where ever they are used. Also, Address rollover is the default action for when the end of the memory bank is reached during any operation - rollover can be disabled globally with an optional argument in the constructor. (Now that I think of it, perhaps I should make it a local argument in any function that requires it - it might give a user more flexibility?).
Thank you for your suggestion on the debug code. My version is a bit clumsy I admit, but it outputs the code in a neat 16/16 grid which makes it easy to read. I'm still trying to see if there's a cleaner way of formatting the output, but I'm pretty much a self-taught programmer (I'm a geneticist by trade) and I'd love to learn a new way of doing things if you have any suggestions.

I've used some of the code from your suggestion (below) in the latest version of the library. Thank you for that!
uint8_t x = data_buffer[a * 16 + b];
if (x < 10) Serial.print("0");
if (x < 100) Serial.print("0");
Serial.print(x);
Serial.print(',');
I've actually re-written writePage() completely so it no longer uses _writePage(). My current version checks the written data byte by byte without actually having to read it all into a buffer first. Saves a ton of time in the process and catches errors exactly where they happen. I'm toying with the idea of including a subroutine in my error checking protocol to return the exact location of the error so a user can ID any faulty registers.