The issue occurs on a publishing site that has a contenttype containing a Publishing Hyperlink (SPFieldLink).
Inserting a link with the Link Tools Tab of the ribbon works fine, but removing the link after it has been set does not.
Found a post on Stackoverflow that describes the issue in detail:

For quick reproduction: (steps and testing by M. Siepel)

  • Create a Publishing Portal site
  • Create a column of type Publishing Hyperlink 
  • Add the column to de Welcome Page contenttype
  • Navigate to the Press Releases page 
  • View information -> Edit
  • Add a link to the newly created column and save the page
  • Open it again, remove the link (the link is visually removed, it even says: Click here to add a new Hyperlink)
  • Save the page again
  • Now open the page again. 
  • In our situation, the message 'Click here...' is gone, and if you view the source our original link is still there, but there is no text inside it.

I did some testing on it and these are the results:

  • It occurs on dev and prod server with a custom solution installed
  • It occurs on a server with no custom solution installed (clean install)
  • It also occurs on the 'Adventure Works' site (both on a clean install and on a server with custom solution) 
  • It occurs both when creating a sitecolumn of type Publishing Hyperlink through API and UI
  • When viewed with firebug the 'deleted' link is still in the href property, but the text property is empty
  • Tested on IE/FF
  • When viewing with Sharepoint Manager 2010, the link is still in de DB (with no text property as stated above)
  • It happens on Dutch and English sites.

A little more time on the Bing machine resulted in finding a post from M Siepel on the Microsoft forums:
http://social.msdn.microsoft.com/Forums/en-AU/sharepoint2010general/thread/8ce468ec-096b-4ad2-a1e9-0bfb93cecf95

Basicly it states that the bug can be reproduced consistently and it has been reported to the product team. Lets hope this will be fixed in the next CU.

Someone already created a powershell fix, but that is not really end-user friendly. I will update this post

Param([string]$site0=http://mysharepoint, 
[string]$list0="My List",
[string]$itemKey0="Item Key",
[string]$linkUrl0=http://newlink,
[string]$desc0="New description",
[string]$toolTip0="New Tooltip") $site = Get-SPSite($site0) $rootWeb = $site.rootWeb $lists = $rootWeb.Lists $list = $lists[$list0] $items = $list.Items $listItem = $items | Where-Object {$_.Name -eq $itemKey0} $linkUrl = $listItem["Link Url"] $linkUrl.NavigateUrl = $linkUrl0 $linkUrl.Description = $desc0 $linkUrl.ToolTip = $toolTip0 # this is the trick - set the object back to listItem $listItem["Link Url"] = $linkUrl $listItem.Update()