You would use guids as a key if you needed multiple databases synchronising via replication.
Another reason to use guids is if you wanted to create rows on some remote client eg a winforms app and then submit those to the server via web services etc.
If you do this I would strongly suggest that you make sure that you specify your own clustered index based on an auto incrementing int that is not unique. It can be a considerable overhead inserting rows into a table where the clustered index is a guid.
Update: Here is an example of how to set up a table like this:
CREATE TABLE [dbo].[myTable](
[intId] [int] IDENTITY(1,1) NOT NULL,
[realGuidId] [uniqueidentifier] NOT NULL,
[someData] [varchar](50) NULL,
CONSTRAINT [PK_myTable] UNIQUE NONCLUSTERED
(
[realGuidId] ASC
)
)
CREATE CLUSTERED INDEX [IX_myTable] ON [dbo].[myTable]
(
[intId] ASC
)
You would insert into the table as normal e.g.:
INSERT INTO myTable VALUES(NEWID(), 'Some useful data goes here')
Update: I listened to a really good dotnetrocks episode that talks about this its worth a listen - Show #447