Deadlock occur in a delete insert scenario &lt;deadlock-list&gt;
  &lt;deadlock victim="process14012e08"&gt;
    &lt;process-list&gt;
      &lt;process id="process14012e08" taskpriority="0" logused="148" 
               waitresource="PAGE: 28:1:762341" waittime="6583" 
               ownerId="54542271281" transactionname="DELETE" 
               lasttranstarted="2013-06-22T01:04:20.450" XDES="0x64de49950" 
               lockMode="S" schedulerid="26" kpid="13336" status="suspended" spid="1239" 
               sbid="0" ecid="0" priority="0" trancount="2" 
               lastbatchstarted="2013-06-22T01:00:19.120" 
               lastbatchcompleted="2013-06-22T01:00:19.117" hostpid="15675" 
               isolationlevel="read committed (2)" xactid="54542271281" currentdb="28" 
               lockTimeout="4294967295" clientoption1="671350816" clientoption2="128056"&gt;
        &lt;executionStack&gt;
          &lt;frame procname="adhoc" line="3" stmtstart="134" stmtend="332" 
                 sqlhandle="0x02000000e5eb1a38144fa5c164b3c876cc2c8da059bf3bb1"&gt;
            delete from grid_col where grid_col_id not in (select grid_col_id from grid)
          &lt;/frame&gt;
        &lt;/executionStack&gt;
        &lt;inputbuf&gt;
          set rowcount 10000
          while 1 = 1
          begin delete from grid_col where grid_col_id not in (select grid_col_id from grid)
          if @@rowcount = 0
          break
          end
          set rowcount 0
        &lt;/inputbuf&gt;
      &lt;/process&gt;
      &lt;process id="process10031288" taskpriority="0" logused="912" 
               waitresource="OBJECT: 28:731149650:16 " waittime="40270" 
               ownerId="54542276360" transactionname="insertRows" 
               lasttranstarted="2013-06-22T01:04:23.753" XDES="0x1641ef9400" 
               lockMode="IS" schedulerid="17" kpid="29104" status="suspended" spid="351" 
               sbid="0" ecid="0" priority="0" trancount="2" 
               lastbatchstarted="2013-06-22T01:04:23.753" 
               lastbatchcompleted="2013-06-22T01:04:23.660" 
               isolationlevel="read committed (2)" xactid="54542276360" 
               lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"&gt;
        &lt;executionStack&gt;
          &lt;frame procname="check_grid_col" line="1" stmtstart="226" stmtend="376" 
                 sqlhandle="0x03001c00fe2706376157a70026a000000000000000000000"&gt;
            SELECT @retval = COUNT(*) from grid_col where grid_col_id = @grid_col
          &lt;/frame&gt;
          &lt;frame procname="adhoc" line="1" stmtstart="34376" stmtend="35270" 
                 sqlhandle="0x02000000434dff26c45f91c6fdb640bbbf3a4a276f6ac605"&gt;
            INSERT INTO grid (grid_id,grid_col_id,value) VALUES ( @P2 , @grid_col_id,@P3)
          &lt;/frame&gt;
        &lt;/executionStack&gt;
        &lt;inputbuf&gt;
          (@P0 bigint,@P1 int,@P2 char(300))
        &lt;/inputbuf&gt;
      &lt;/process&gt;
    &lt;/process-list&gt;
    &lt;resource-list&gt;
      &lt;pagelock fileid="1" pageid="762341" dbid="28" objectname="grid" 
                id="lock1cb9187500" mode="IX" associatedObjectId="72057594070695936"&gt;
        &lt;owner-list&gt;
          &lt;owner id="process10031288" mode="IX" /&gt;
        &lt;/owner-list&gt;
        &lt;waiter-list&gt;
          &lt;waiter id="process14012e08" mode="S" requestType="wait" /&gt;
        &lt;/waiter-list&gt;
      &lt;/pagelock&gt;
      &lt;objectlock lockPartition="16" objid="731149650" subresource="FULL" 
                  dbid="28" objectname="grid_col" id="lock12e6c78f00" mode="X" 
                  associatedObjectId="731149650"&gt;
        &lt;owner-list&gt;
          &lt;owner id="process14012e08" mode="X" /&gt;
        &lt;/owner-list&gt;
        &lt;waiter-list&gt;
          &lt;waiter id="process10031288" mode="IS" requestType="wait" /&gt;
        &lt;/waiter-list&gt;
      &lt;/objectlock&gt;
    &lt;/resource-list&gt;
  &lt;/deadlock&gt;
&lt;/deadlock-list&gt;
An example of how it can happen:

Two processes, each one has a shared lock on the same page, then an exclusive lock is needed by each process. Each process can't exclusively lock the page because of the shared row locks.

So, a deadlock happens on the same page.

More examples here from @AlexK